Вертикальное выравнивание тиков по оси Y на тепловой карте Seaborn - PullRequest
0 голосов
/ 14 ноября 2018

Я строю график Seaborn heatmap и хочу центрировать метки y-axis, но не могу найти способ сделать это.'va' текстовое свойство, по-видимому, недоступно для yticks().

С учетом следующего image

enter image description here I 'Я хотел бы выровнять дни недели по центру ряда квадратов

Код , чтобы сгенерировать этот график:

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

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Решение onno работает в этом конкретном случае (у графиков матричного типа обычно есть метки в середине патчей), но также рассмотрим следующие более общие способы, чтобы помочь вам:

а) узнать, где тики первые

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

б) используйте объектно-ориентированный API для настройки только текста

команды pyplot xticks & yticks обновляют одновременно позиции и текст. Но объект оси имеет независимые методы для позиций (ax.set_yticks(pos)) и для текста (ax.set_yticklabels(labels)).

Пока вы знаете, сколько этикеток нужно изготовить (и их порядок), вам даже не нужно думать об их позициях для обновления текста.

ax.set_yticklabelss(('Mon','Tue','Wed','Thu','Fri','Sat','Sun'), 
    rotation=0, fontsize="10", va="center")
0 голосов
/ 14 ноября 2018

добавление +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")
...