我正在绘制Seaborn heatmap
,并且想将y-axis
刻度标签居中,但是找不到解决方法。 'va'
上的yticks()
文本属性似乎不可用。
考虑以下图片
代码以生成该图:
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
#Generate dummy data
startDate = '2017-11-25'
dateList = pd.date_range(startDate, periods=365).tolist()
df = pd.DataFrame({'Date': dateList,
'Distance': np.random.normal(loc=15, scale=15, size=(365,))
})
#set week and day
df['Week'] = [x.isocalendar()[1] for x in df['Date']]
df['Day'] = [x.isocalendar()[2] for x in df['Date']]
#create dataset for heatmap
#group by axis to plot
df = df.groupby(['Week','Day']).sum().reset_index()
#restructure for heatmap
data = df.pivot("Day","Week","Distance")
#configure the heatmap plot
sns.set()
fig, ax = plt.subplots(figsize=(15,6))
ax=sns.heatmap(data,xticklabels=1,ax = ax, robust=True, square=True,cmap='RdBu_r',cbar_kws={"shrink":.3, "label": "Distance (KM)"})
ax.set_title('Running distance', fontsize=16, fontdict={})
#configure the x and y ticks
plt.xticks(fontsize="9")
plt.yticks(np.arange(7),('Mon','Tue','Wed','Thu','Fri','Sat','Sun'), rotation=0, fontsize="10", va="center")
#set labelsize of the colorbar
cbar = ax.collections[0].colorbar
cbar.ax.tick_params(labelsize=10)
plt.show()
答案 0 :(得分:3)
在+0.5
中将np.arange(7)
添加到plt.yticks
中对我有用
plt.yticks(np.arange(7)+0.5,('Mon','Tue','Wed','Thu','Fri','Sat','Sun'), rotation=0, fontsize="10", va="center")
答案 1 :(得分:2)
onno的解决方案适用于这种特定情况(矩阵型图通常在补丁中间带有标签),但也可以考虑以下更通用的方法来帮助您:
a)找出刻度线在哪里
pos, textvals = plt.yticks()
print(pos)
>>> [0.5 1.5 2.5 3.5 4.5 5.5 6.5]
当然,您可以在更新过程中直接使用这些职位:
plt.yticks(pos,('Mon','Tue','Wed','Thu','Fri','Sat','Sun'),
rotation=0, fontsize="10", va="center")
b)使用基于对象的API仅调整文本
pyplot命令xticks
和yticks
同时更新位置和文本。但是axis对象具有用于位置(ax.set_yticks(pos)
)和文本(ax.set_yticklabels(labels)
)的独立方法。
只要您知道要产生多少个标签(及其顺序),您甚至都无需考虑它们用于更新文本的位置。
ax.set_yticklabelss(('Mon','Tue','Wed','Thu','Fri','Sat','Sun'),
rotation=0, fontsize="10", va="center")
答案 2 :(得分:1)
这是一个老问题,但我最近遇到了这个问题,发现这对我有用:
g = sns.heatmap(df)
g.set_yticklabels(labels=g.get_yticklabels(), va='center')
当然你也可以像在 OP 中那样定义 labels=myLabelList