Я пытаюсь сделать контурный график 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
данные, так же, как указано выше. Между тем перед тем, как получить данные из рисунка, существует множество расчетов.
Изменить на основе вашего комментария ниже: вы можете ограничить контуры в регионе/диапазоне, который вы хотите. Например, я изменил данные 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,))
Выход
Вы можете создать пользовательскую цветовую палитру на основе существующей и заменить один из цветов, например, красным.
Затем вы можете использовать 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()
last_cont
иnew_cmap
? В настоящее время они не определены. Сделайте код таким, чтобы ваша фигура воспроизводилась