Использование другой карты / цвета для одного уровня в контуре

1

Я пытаюсь сделать контурный график contourf с некоторыми значениями x, y и z. В основном значения z будут определять цвет графика. Однако, когда я нахожусь сейчас, один регион (т.е. Важный для меня регион) очень мал по сравнению с остальными (см. Рисунок), поэтому на самом деле может быть очень трудно увидеть этот конкретный регион (несколько маленьких черных "точек",). Поэтому я думал, возможно ли, возможно, получить первый lvl (или последний уровень, так как это отрицательные значения в этом случае) в другом цвете, или, может быть, очертить его тонкой белой линией или чем-то еще, поэтому можно действительно увидеть маленькие и важные точки?

Я рисую с помощью этого кода:

import matplotlib.pyplot as plt
from matplotlib import rcParams
import matplotlib.colors as colors
import numpy as np

nx = 41
ny = 67

x = np.linspace(0.01, 1, nx)
y = np.linspace(0.01, 2, ny)
x_bc = x[:, np.newaxis]
y_bc = y[np.newaxis, :]

z = x_bc*y_bc

max_value = np.amax(z)
cmapp = plt.get_cmap('Greys')

level_intervals = [100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 8, 1.92, 0]
level_list = [max_value-i for i in level_intervals]

col_bar = plt.contourf(x, y, z.T, level_list, cmap=cmapp)
plt.xlabel('x')
plt.ylabel('y')
plt.colorbar(col_bar, cmap=cmapp)

plt.show()

Я сожалею, что не предоставил никаких реальных данных, но я не могу воспроизвести данные, используемые для сюжета ниже (где на самом деле есть небольшие количества/точки почти черного цвета, внутри почти черного (странное предложение). Однако размер и как создаются z данные, так же, как указано выше. Между тем перед тем, как получить данные из рисунка, существует множество расчетов.

Изображение 174551

  • 2
    Что такое last_cont и new_cmap ? В настоящее время они не определены. Сделайте код таким, чтобы ваша фигура воспроизводилась
  • 0
    Извините, забыл изменить это. Это должно быть исправлено сейчас.
Показать ещё 3 комментария
Теги:
matplotlib
contourf

2 ответа

2
Лучший ответ

Изменить на основе вашего комментария ниже: вы можете ограничить контуры в регионе/диапазоне, который вы хотите. Например, я изменил данные x, y и z в вашем примере кода выше, чтобы нарисовать больше контурных линий. Затем я выбираю только контурные линии для наивысших levels = sorted(level_list)[-5:] (последние 5 строк здесь) для выделения цветом с красным цветом. Попробуйте сделать это для ваших фактических данных и посмотрите, станут ли точки в интересующей области. Я пишу ниже только строки, которые я изменил в вашем коде.

fig = plt.figure(figsize=(8, 6))
nx = 67
ny = 77

# Modified your actual values to get some more contour lines
x = np.linspace(1, 16, nx)
y = np.linspace(1, 15, ny)
z = x_bc*y_bc*0.2

col_bar = plt.contourf(x, y, z.T, level_list, cmap=cmapp)
plt.contour(col_bar, levels = sorted(level_list)[-5:], colors=('r',),linestyles=('-',),linewidths=(3,))

Выход

Изображение 174551

  • 0
    Так что да, это подчеркивает края контуров, но, к сожалению, это все из них. Таким образом, вместо того, чтобы просто выделять уровень контура самого высокого уровня (около 0,8 в вашем случае), каждый уровень выделяется.
  • 0
    Хорошо, проверьте мой отредактированный ответ
Показать ещё 2 комментария
1

Вы можете создать пользовательскую цветовую палитру на основе существующей и заменить один из цветов, например, красным.
Затем вы можете использовать BoundaryNorm для использования цветов из новой цветовой карты для указанных уровней.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

d = np.linspace(-3,3)
x,y = np.meshgrid(d,d)
data = -585.22 + 94*np.exp(-(x**2+y**2))
levels = np.linspace(-585.22, -485.22, 13)
norm = matplotlib.colors.BoundaryNorm(levels,len(levels))

colors = list(plt.cm.Greys(np.linspace(0,1,len(levels)-1)))
colors[-1] = "red"
cmap = matplotlib.colors.ListedColormap(colors,"", len(colors))

im = plt.contourf(data, levels, cmap=cmap, norm=norm)

plt.colorbar(ticks=levels)

plt.show()

Изображение 174551

  • 0
    Также спасибо за это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню