Ярлыки в виде цветовых полос в качестве выходов журнала
Я играю с histogram2d
и я пытаюсь включить цветную шкалу логарифмических значений.
Вот мой текущий код:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.colors import LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list('mycmap', ['black', 'maroon',
'crimson', 'orange', 'white'])
fig = plt.figure()
ax = fig.add_subplot(111)
H = ax.hist2d(gas_pos[:,0]/0.7, gas_pos[:,1]/0.7, cmap=cmap,
norm=matplotlib.colors.LogNorm(), bins=350, weights=np.log(gas_Temp))
ax.tick_params(axis=u'both', which=u'both',length=0)
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
cb = fig.colorbar(H[3], ax=ax, shrink=0.8, pad=0.01,
orientation="horizontal", label=r'$\log T\ [\mathrm{K}]$')
cb.ax.set_xticklabels([1,2,3,4])
cb.update_ticks()
empty = Rectangle((0,0 ), 0, 0, alpha=0.0)
redshift = fig.legend([empty], [r'$z = 127$'],
loc='upper right', frameon=False, handlelength=0, handletextpad=0)
redshift.get_texts()[0].set_color('white')
#fig.add_artist(redshift)
plt.show()
Веса - это значения, не прошедшие через np.log()
и в настоящее время нормализуются через LogNorm()
,
То, что я пытаюсь получить, - это чтобы метки цветовой шкалы были логарифмическими значениями того, что есть в данный момент, например. 10**4 --> 4
, 10**6 --> 6
, так далее.
Я попытался изменить форматирование, а также пройти через логарифмические значения np.log(gas_Temp)
, но на самом деле ничего не работает.
1 ответ
Идиоматическая вещь, которую нужно сделать, это использовать LogFormatterExponent для форматирования вашей цветовой панели. Это именно то, что вам нужно: для отображения 10**x
значения как x
или, другими словами, для отображения y
значения как log10(x)
,
Доказательство с использованием фиктивных данных:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from matplotlib.ticker import LogFormatterExponent # <-- one new import here
# generate dummy data
histdata = 10**(np.random.rand(200,200)*4 + 1) # 10^1 -> 10^5
# plot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.tick_params(axis=u'both', which=u'both',length=0)
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
im = plt.imshow(histdata,cmap='viridis',norm=LogNorm())
cb = fig.colorbar(im, ax=ax, shrink=0.8, pad=0.01,
orientation="horizontal", label=r'$\log T\ [\mathrm{K}]$')
# v-- one new line here
cb.formatter = LogFormatterExponent(base=10) # 10 is the default
cb.update_ticks()
Сравните результат вашего оригинала (слева) с измененной версией (справа):