【发布时间】:2021-04-08 18:28:40
【问题描述】:
我有一个数据框,其中包含某个计算的结果,我想将其绘制为带有彩条的 seaborn 热图。我正在使用以下代码来实现这一点(主要取自这里:enter link description here):
# input data
results = [['equal','equal','smaller','smaller or equal','greater or equal'],
['equal','equal','smaller','smaller','greater or equal'],
['greater','equal','smaller or equal','smaller','smaller'],
['equal','smaller or equal','greater or equal','greater or equal','equal'],
['equal','equal','smaller','equal','equal']]
index = ['axc', 'org', 'cf5', 'cm1', 'ext']
columns = ['axc', 'org', 'cf5', 'cm1', 'ext']
# create a dataframe
res_df = pd.DataFrame(results, columns, index)
value_to_int = {j:i for i,j in enumerate(['greater','greater or equal','equal','smaller or equal','smaller'])}
n = len(value_to_int)
# discrete colormap (n samples from a given cmap)
cmap = sns.color_palette("viridis", n)
ax = sns.heatmap(res_df.replace(value_to_int), cmap=cmap)
# modify colorbar:
colorbar = ax.collections[0].colorbar
r = colorbar.vmax - colorbar.vmin
colorbar.set_ticks([colorbar.vmin + r / n * (0.5 + i) for i in range(n)])
colorbar.set_ticklabels(list(value_to_int.keys()))
plt.show()
它在大多数时候就像一个魅力,但如果索引列表中的一个类不存在,就会出现问题。为了演示,如果您像这样更改数据框:
results_changed = [['equal','equal','smaller','smaller or equal','greater or equal'],
['equal','equal','smaller','smaller','greater or equal'],
['greater or equal','equal','smaller or equal','smaller','smaller'],
['equal','smaller or equal','greater or equal','greater or equal','equal'],
['equal','equal','smaller','equal','equal']]
index = ['axc', 'org', 'cf5', 'cm1', 'ext']
columns = ['axc', 'org', 'cf5', 'cm1', 'ext']
# create a dataframe
res_df = pd.DataFrame(results_changed, columns, index)
value_to_int = {j:i for i,j in enumerate(['greater','greater or equal','equal','smaller or equal','smaller'])}
n = len(value_to_int)
# discrete colormap (n samples from a given cmap)
cmap = sns.color_palette("viridis", n)
ax = sns.heatmap(res_df.replace(value_to_int), cmap=cmap)
# modify colorbar:
colorbar = ax.collections[0].colorbar
r = colorbar.vmax - colorbar.vmin
colorbar.set_ticks([colorbar.vmin + r / n * (0.5 + i) for i in range(n)])
colorbar.set_ticklabels(list(value_to_int.keys()))
plt.show()
然后继续绘图,生成的热图将为类分配错误的颜色——因为现在没有“更大”的情况,它会“移动”调色板,并且不会像以前那样为 equal 分配正确的颜色。
我试图通过更改代码中的这一行来解决问题:
value_to_int = {j:i for i,j in enumerate(pd.unique(res_df.values.ravel()))}
虽然它解决了颜色分配问题,但它会产生另一个问题,因为颜色条会弄乱颜色的顺序(我想避免这种情况)。
谁能建议如何解决这个问题?如有任何建议,我将不胜感激。
【问题讨论】: