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

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

Я строю с этим кодом:

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 такой же, как и выше. Однако было получено много вычислений за период до получения данных из рисунка.

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы можете создать собственную цветовую карту на основе существующей и заменить один из цветов, например, на. красный.
Затем вы можете использовать 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()

enter image description here

0 голосов
/ 29 августа 2018

Изменить на основе вашего комментария ниже: Вы можете ограничить контуры в области / диапазоне, который вы хотите. Например, я изменил данные 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,))

выход

enter image description here

...