我正在嘗試使用 Seaborn 包制作熱圖,在其中定義自己的顏色范圍。但是,我無法讓圖例以非連續方式顯示值。我想要以下顏色指示:
0-0.001:綠色
0.001-0.25:黃色
0.25-0.50:橙色
0.50-0.75:紅色
0.75-1.00:深紅色
但我明白了:

我懷疑第一個范圍會干擾圖片,因為它更小。但是,我希望圖例“盒子”或區域的大小相同。因此是否有可能有這樣或類似的東西:

我目前使用的代碼是下面的代碼。任何提示或建議將不勝感激。謝謝!
my_colors=['#02ab2e','gold','orange','red', 'darkred']
grid_kws = {"height_ratios": (.9, .025), "hspace": .1}
f, (ax, cbar_ax) = plt.subplots(2, gridspec_kw=grid_kws)
ax = sns.heatmap(STEdata.iloc[:,3:13].reindex(ste_order_reg.sort_values().index, axis=0),
yticklabels=2, ax=ax,
cmap = my_colors,
cbar_ax=cbar_ax,
cbar_kws={"orientation": "horizontal"})
# sns.set(rc = {'figure.figsize':(8, 18)})
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([0, 0, 0.25, 0.5, .75])
colorbar.set_ticklabels(['0',']0-0.25]', ']0.25-0.50]',']0.50-0.75]', ']0.75-1.00]'])
uj5u.com熱心網友回復:
要設定不均勻的顏色范圍,BoundaryNorm可以使用 a。顏色條刻度可以位于每個范圍的中心。AListedColormap從顏色串列創建顏色圖。
import matplotlib.pyplot as plt
from matplotlib.colors import BoundaryNorm, ListedColormap
import seaborn as sns
import numpy as np
my_colors = ['#02ab2e', 'gold', 'orange', 'red', 'darkred']
my_cmap = ListedColormap(my_colors)
bounds = [0, 0.0001, 0.25, 0.50, 0.75, 1]
my_norm = BoundaryNorm(bounds, ncolors=len(my_colors))
grid_kws = {"height_ratios": (.9, .025), "hspace": .1}
fig, (ax, cbar_ax) = plt.subplots(nrows=2, figsize=(8,18), gridspec_kw=grid_kws)
sns.heatmap(np.clip(np.random.rand(21, 12) - 0.1, 0, 1),
yticklabels=2,
ax=ax,
cmap=my_cmap,
norm=my_norm,
cbar_ax=cbar_ax,
cbar_kws={"orientation": "horizontal"})
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([(b0 b1)/2 for b0, b1 in zip(bounds[:-1], bounds[1:])])
colorbar.set_ticklabels(['0', ']0-0.25]', ']0.25-0.50]', ']0.50-0.75]', ']0.75-1.00]'])
plt.show()

可以創建自定義圖例,而不是顏色圖。在熱圖中分配正確的BoundaryNorm顏色也需要這樣做。ax.text()并可ax.hlines()用于為分組放置文本和行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/440759.html
標籤:Python matplotlib 海运 传奇 热图
