问题描述
我有一个 seaborn 热图,如下所示:
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
results_changed = [['equal','equal','smaller','smaller or equal','greater or equal'],['equal',['greater or equal','smaller'],'greater or equal','equal'],'equal']]
index = ['axc123abc','org567def','cf5010wer','cm1235ert','ext447tyu']
columns = ['axc123abc','ext447tyu']
# create a dataframe
res_df = pd.DataFrame(results_changed,columns,index)
#construct dictionary from ordered list
category_order = ['greater','smaller']
value_to_int = {j:i for i,j in enumerate(category_order)}
n = len(value_to_int)
# discrete colormap (n samples from a given cmap)
cmap = sns.color_palette("flare",n)
ax = sns.heatmap(res_df.replace(value_to_int),cmap=cmap,vmin=0,vmax=n)
#modify colorbar:
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([0.5 + i for i in range(n)])
colorbar.set_ticklabels(category_order)
ax.tick_params(right=True,top=True,labelright=True,labeltop=True)
plt.tight_layout()
plt.show()
我想通过为图形两侧(不仅仅是底部和左侧)的轴添加刻度描述来使其更具可读性。我设法通过添加一行代码来做到这一点,如下所示:
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
results_changed = [['equal',vmax=n)
#modify colorbar:
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([0.5 + i for i in range(n)])
colorbar.set_ticklabels(category_order)
# newly added code line
ax.tick_params(right=True,labeltop=True)
plt.tight_layout()
plt.show()
问题是,这些添加的刻度描述并不完全可见(由于它们的长度)。我不确定如何在特定轴上旋转刻度描述。我希望上部的刻度垂直放置(就像底部的刻度)和右侧的刻度水平放置(就像左侧的刻度一样)。我怎样才能做到这一点并在图中很好地拟合热图、轴的刻度描述和颜色条?如有任何建议,我将不胜感激。
解决方法
你可以这样做:
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
results_changed = [['equal','equal','smaller','smaller or equal','greater or equal'],['equal',['greater or equal','smaller'],'greater or equal','equal'],'equal']]
index = ['axc123abc','org567def','cf5010wer','cm1235ert','ext447tyu']
columns = ['axc123abc','ext447tyu']
# create a dataframe
res_df = pd.DataFrame(results_changed,columns,index)
# construct dictionary from ordered list
category_order = ['greater','smaller']
value_to_int = {j: i for i,j in enumerate(category_order)}
n = len(value_to_int)
# discrete colormap (n samples from a given cmap)
cmap = sns.color_palette("flare",n)
ax = sns.heatmap(res_df.replace(value_to_int),cmap=cmap,vmin=0,vmax=n,cbar_kws=dict(pad=0.2))
# modify colorbar:
colorbar = ax.collections[0].colorbar
colorbar.set_ticks([0.5 + i for i in range(n)])
colorbar.set_ticklabels(category_order)
# newly added code line
ax.tick_params(right=True,top=True,labelright=True,labeltop=True)
plt.xticks(rotation=90)
plt.yticks(rotation=0)
plt.tight_layout()
plt.show()
输出: