如何更改某些轴上的seaborn热图tick_params文本方向并使其完全适合图片

问题描述

我有一个 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()  

heatmap_with_left_and_down_tick_descriptions

我想通过为图形两侧(不仅仅是底部和左侧)的轴添加刻度描述来使其更具可读性。我设法通过添加一行代码来做到这一点,如下所示:

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()  

heatmap_with_all_tick_descriptions

问题是,这些添加的刻度描述并不完全可见(由于它们的长度)。我不确定如何在特定轴上旋转刻度描述。我希望上部的刻度垂直放置(就像底部的刻度)和右侧的刻度水平放置(就像左侧的刻度一样)。我怎样才能做到这一点并在图中很好地拟合热图、轴的刻度描述和颜色条?如有任何建议,我将不胜感激。

解决方法

你可以这样做:

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()

输出:

Seaborn heatmap with customised ticks

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...