对于上面的问题,我发现了一个类似的解决方案,当时我在寻找如何旋转轴上的刻度值。
我遇到的问题是在使用Seaborn和FacetGrid渲染Heatmap时,我可以通过以下方式旋转x轴上的刻度,但无法旋转y轴上的刻度...
for ax in fg.axes.flat:
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
ax.set_yticklabels(ax.get_yticklabels(), rotation=45)
我发现yticks为空,最终被替换为null列表。这是因为列包裹col_wrap
中的最终数据没有yticks,因为我将它们对齐在左侧,所以2x2网格矩阵中的第0个和第2个yticks被第1个和第3个yticks覆盖了。xticks没有这个问题,因为xtick值相反,第0个和第2个xticks为空,而第1个和第3个有值。我通过打印g.get_yticklabels()
来发现这个特性:
g = sns.heatmap(d, **kwargs)
print(g.get_yticklabels())
[Text(0, 0.5, '5'), Text(0, 1.5, '8'), Text(0, 2.5, '12'), Text(0, 3.5, '15'), Text(0, 4.5, '19'), Text(0, 5.5, '22'), Text(0, 6.5, '25'), Text(0, 7.5, '26'), Text(0, 8.5, '29'), Text(0, 9.5, '33'), Text(0, 10.5, '34'), Text(0, 11.5, '36'), Text(0, 12.5, '40'), Text(0, 13.5, '43'), Text(0, 14.5, '47')]
[]
[Text(0, 0.5, '1'), Text(0, 1.5, '5'), Text(0, 2.5, '8'), Text(0, 3.5, '12'), Text(0, 4.5, '15'), Text(0, 5.5, '19'), Text(0, 6.5, '22'), Text(0, 7.5, '25'), Text(0, 8.5, '26'), Text(0, 9.5, '29'), Text(0, 10.5, '33'), Text(0, 11.5, '34'), Text(0, 12.5, '36'), Text(0, 13.5, '40'), Text(0, 14.5, '43'), Text(0, 15.5, '47')]
[]
我的解决方法是只有在存在{x,y}tick
时才执行旋转操作:
g = sns.heatmap(d, **kwargs)
if g.get_yticklabels():
g.set_yticklabels(g.get_yticklabels(), rotation=30)
if g.get_xticklabels():
g.set_xticklabels(g.get_xticklabels(), rotation=45)
这是在循环函数中执行的,然后映射到FacetGrid。这假定所有四个图都具有等效的{x,y}ticks
。
def draw_heatmap(*args, **kwargs):
data = kwargs.pop('data')
d = data.pivot(index=args[1], columns=args[0], values=args[2])
hl = args[3]
lwrbnd, uprbnd = data[args[2]].describe([hl,1-hl]).iloc[[4,6]].values
g = sns.heatmap(d, **kwargs, vmin=lwrbnd, vmax=uprbnd)
if g.get_yticklabels():
g.set_yticklabels(labels=g.get_yticklabels(), rotation=30)
if g.get_xticklabels():
g.set_xticklabels(g.get_xticklabels(), rotation=45)
fg = sns.FacetGrid(multidf.groupby(findx).mean().reset_index(),
col_wrap=col_wrp, col=ondx, height=5, sharey=True)
fg.map_dataframe(draw_heatmap, 'col', 'row', toggle, hl, square=True,
cmap="YlGnBu")
plt.yticks(rotation=0)
。 - Tomyticks = data.index
yticks = [str(x) if i % 10 == 0 else '' for i,x in enumerate(yticks)]
。 - Overdrivr