一个水平颜色条用于seaborn heatmaps子图和Annot问题用xticklabels

时间:2017-07-15 20:22:05

标签: python python-3.x heatmap seaborn

我试图在一个图中写下多个热图。 我写了下面的代码,我有两个问题。

(1)我想要每个单元格中的数据值,并且我不需要每张图片的轴标签。因此,我设置xticklabels,yticklables和annot;但他们没有反映在图中。我应该怎么做? (2)我可以旋转彩条吗?我需要一个水平颜色条来实现这个目标。

我在Ubuntu 14.04.5 LTS中使用Python 3.5.2。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

%matplotlib notebook

flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
fig = plt.figure(figsize=(15, 8))
# integral
plt.subplot(1,2,1)
sns.set(font_scale=0.8)
plt.title('integral', fontsize = 1)
plt.subplots_adjust(top=0.90, left = 0.1)
sns.heatmap(flights, fmt='d', cmap='gist_gray_r', xticklabels = False, yticklabels = False, annot=True)

#float
plt.subplot(1,2,2)
sns.set(font_scale=0.8)
plt.title('float', fontsize = 1)
plt.subplots_adjust(top=0.90, left = 0.1)
sns.heatmap(flights, annot=True, fmt='.2f', cmap='gist_gray_r', xticklabels = False, yticklabels = False)

fig.suptitle('Title for figure', fontsize=20)
plt.subplots_adjust(top=0.9, left=0.06, bottom=0.08) #後ろ2つ追加
#x label
fig.text(0.5, 0.02, 'year', ha='center', va='center')
#y label
fig.text(0.02, 0.5, 'month', ha='center', va='center', rotation='vertical')

sns.plt.savefig('heatmap.png')

enter image description here

1 个答案:

答案 0 :(得分:3)

  

(1)我想要每个单元格中的数据值,而我不需要轴   每张图片的标签。因此,我设置xticklabels,yticklables,   和annot;但他们没有反映在图中。我该怎么办?

xticklabels = False yticklabels = Falseannot = Truexticklabels不起作用。解决方法是将yticklabels[""]都设置为空字符串fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)的列表。

我做了一个调整,用""声明子图轴,这对于理解代码更好。我使用ax1.set_ylabel('')之类的所有轴标签设置为sns.heatmap,因此在清理之后,我们可以创建我们想要的标签,而不是使用fig.text自动生成的标签。此外,与使用cbar_kws={"orientation": "horizontal"}手动设置相比,图中的标签更好地生成。

  

(2)我可以旋转颜色条吗?

sns.heatmapimport matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np flights = sns.load_dataset("flights") flights = flights.pivot("month", "year", "passengers") fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True) #First sns.heatmap(flights, ax=ax1, fmt='d', cmap='gist_gray_r', xticklabels = [""], yticklabels = [""], annot = True, cbar_kws={"orientation": "horizontal"}) ax1.set_ylabel('') ax1.set_xlabel('') ax1.set_title('Integral') #Second sns.heatmap(flights, ax=ax2, fmt='.2f', cmap='gist_gray_r', xticklabels = [""], yticklabels = [""], annot = True, cbar_kws={"orientation": "horizontal"}) ax2.set_ylabel('') ax2.set_xlabel('') ax2.set_title('Float') ax1.set_ylabel("Month") ax1.set_xlabel("Year") ax2.set_xlabel("Year") plt.show() 的参数,它使颜色栏处于水平位置。

使用以下代码:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")

fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)

#First

im = sns.heatmap(flights, ax=ax1, fmt='d', cmap='gist_gray_r', xticklabels = [""], yticklabels = [""], annot = True, cbar = False)
ax1.set_ylabel('')    
ax1.set_xlabel('')
ax1.set_title('Integral')

#Second

sns.heatmap(flights, ax=ax2, fmt='.2f', cmap='gist_gray_r', xticklabels = [""], yticklabels = [""], annot = True, cbar = False)
ax2.set_ylabel('')    
ax2.set_xlabel('')
ax2.set_title('Float')

ax1.set_ylabel("Month")
ax1.set_xlabel("Year")
ax2.set_xlabel("Year")

mappable = im.get_children()[0]
plt.colorbar(mappable, ax = [ax1,ax2],orientation = 'horizontal')

plt.show()

生成此图像:

recent fixed issue

如果您希望只有一个大的水平颜色条,则可以将代码更改为以下内容:

mappable = im.get_children()[0]

我们正在获取可映射对象:plt.colorbar,然后使用此可映射对象创建[ax1,ax2],并使用ax作为keyboardWillHide参数。我希望每次都可以使用它,它会绘制图像:

enter image description here