Расширение палитры для включения данных вне диапазона - PullRequest
0 голосов
/ 02 августа 2020

Я пытался создать полярную тепловую карту, используя следующий код.

# Plotting the polar plot 
from matplotlib.colorbar import ColorbarBase
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
cmap = obspy_sequential 

# Have defined the variables to be used for pointing to the coordinates 
# baz is angular, slow is radial, abs_power is the value at every co-ordinate
# Choose number of fractions in plot (desirably 360 degree/N is an integer!)
N = 72
N2 = 30
abins = np.arange(N + 1) * 360. / N
sbins = np.linspace(0, 3, N2 + 1)

# Sum rel power in bins given by abins and sbins
hist, baz_edges, sl_edges = \
    np.histogram2d(baz, slow, bins=[abins, sbins], weights=abs_power)

# Transform to radian
baz_edges = np.radians(baz_edges)

# Add polar and colorbar axes
fig = plt.figure(figsize=(8, 8))
cax = fig.add_axes([0.85, 0.2, 0.05, 0.5])
ax = fig.add_axes([0.10, 0.1, 0.70, 0.7], polar=True)
ax.set_theta_direction(-1)
ax.set_theta_zero_location("N")

dh = abs(sl_edges[1] - sl_edges[0])
dw = abs(baz_edges[1] - baz_edges[0])

# Circle through backazimuth
for i, row in enumerate(hist):
    bars = ax.bar((i * dw) * np.ones(N2),
                  height=dh * np.ones(N2),
                  width=dw, bottom=dh * np.arange(N2),color=cmap(row / hist.max()))

ax.set_xticks(np.linspace(0, 2 * np.pi, 10, endpoint=False))
ax.set_yticklabels(velocity)
ax.set_ylim(0, 3)
[i.set_color('white') for i in ax.get_yticklabels()]
ColorbarBase(cax, cmap=cmap,
             norm=LogNorm(vmin=hist.min(),vmax=hist.max()))
plt.show()

Я создаю несколько таких графиков, и поэтому мне нужно расширить диапазон цветовой шкалы за пределы максимума данных abs_power ассортимент. Я попытался изменить vmax и vmin на максимальное-минимальное целевое число, которое я хочу, но каждый раз он строит один и тот же график. Максимальное значение на шкале палитры постоянно меняется, но график не меняется. Почему это происходит? Вот как это выглядит,

Полярная палитра

Здесь фактическая максимальная мощность намного меньше максимальной, указанной в цветовой шкале. По-прежнему видно ярко-желтое пятно. PS: Я получаю тот же график для любых значений vmax, vmin, которые я предоставляю.

1 Ответ

1 голос
/ 02 августа 2020

Изменение шкалы цветов не влияет на основной сюжет. Вам нужно будет изменить формулу, используемую в color=cmap(row / hist.max()), чтобы изменить гистограмму. «Норма» как раз и предназначена для этой задачи. Норма отображает диапазон чисел в интервал [0, 1]. Каждому значению, которое сопоставляется со значением выше 1 (т.е. значению выше, чем hist.max() в примере), назначается самый высокий цвет.

Чтобы цветовая шкала отображала правильную информацию, вам потребуется тот же cmap и та же норма как для графика, так и для шкалы цветов:

my_norm = LogNorm(vmin=hist.min(),vmax=hist.max())
for i, row in enumerate(hist):
    bars = ax.bar((i * dw) * np.ones(N2),
                  height=dh * np.ones(N2),
                  width=dw, bottom=dh * np.arange(N2),color=cmap(my_norm(row)))

и

ColorbarBase(cax, cmap=cmap, norm=my_norm)

С другой стороны, если вы не хотите, чтобы желтый цвет отображался , вы можете попробовать что-то вроде my_norm = LogNorm(vmin=hist.min(), vmax=hist.max()*100) в приведенном выше коде.

Вместо создания шкалы цветов с помощью ColorbarBase можно использовать стандартный plt.colorbar(), но с ScalarMappable, который указывает цветовая карта и используемая норма. В случае LogNorm галочки будут отображаться в формате журнала.

from matplotlib.cm import ScalarMappable
plt.colorbar(ScalarMappable(cmap=cmap, norm=my_norm), ax=ax, cax=cax)
...