Seaborn虫子?热图绘制不一致

时间:2015-12-19 21:00:56

标签: python python-3.x ipython-notebook heatmap seaborn

此代码:

%matplotlib inline

#import numpy as np; np.random.seed(0)
import matplotlib.pyplot as plt
import seaborn as sns #; sns.set()

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

sns.heatmap(flights, annot=True, linewidths=.2, fmt="d")

#plt.show()

会得到the official resultSee/verify it here)的结果:

enter image description here

但是,如果我禁用内联绘图并启用plt.show(),结果将会是这样的:

Annotated heatmaps?

即,注释消失,但如果禁用内联绘图,则一个单元格和y标签方向错误。由于这是我所做的唯一更改,我认为这是seaborn的错误,它无法产生一致的结果。

有人可以确认吗?
请问有什么可能吗?

更新,感谢谢尔盖的反馈意见,以下是我所有相关内容的版本:

Python: 3.5.0 |Anaconda 2.4.0 (64-bit)| (default, Dec  1 2015, 11:46:22) [MSC v.1900 64 bit (AMD64)]
IPython: 4.0.0
Matplotlib: 1.5.0
Seaborn: 0.6.0

所以我认为是导致问题的是Python3或Matplotlib:1.5。我将添加Python3标签,以防万一。

由于

2 个答案:

答案 0 :(得分:3)

此错误实际上已在Seaborn GitHub页面here中报告。从那里的注释中,当matplotlib使用MacOSXTkAggQtAgg后端时(在IPython / Jupyter笔记本中使用%matplotlib notebook时)会出现问题。

原则上,将后端更改为不同的后端应该使绘图按预期工作(如第一张图所示)。从matplotlib's documentation开始,您可以查看

使用的后端
matplotlib.get_backend()

并使用

将其更改为其他名称
matplotlib.use()

不幸的是,似乎所有可用的交互式后端出现此问题。如果这是您所需要的,您可能需要等到错误解决后(您可以在GitHub页面上跟踪该进展)。

如果您很乐意为您的情节制作PNG / PDF文件而不是交互式窗口,Agg后端应该可以正常工作,只需对您的代码稍作修改:

import matplotlib
matplotlib.use("Agg")

import matplotlib.pyplot as plt
import seaborn as sns #; sns.set()

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

sns.heatmap(flights, annot=True, linewidths=.2, fmt="d")

plt.savefig("heatmap.png")

答案 1 :(得分:0)

对我来说,代码产生相同的结果,与我是否使用%matplotlib inline并使其成为plt.show()无关,没有观察到错误。

检查相关所有相关的版本:

import sys
print 'Python: ' + sys.version

import IPython
print 'IPython: ' + IPython.__version__

import matplotlib
print 'Matplotlib: ' + matplotlib.__version__

import seaborn
print 'Seaborn: ' + seaborn.__version__

我的版本供参考:

Python: 2.7.10 |Anaconda 2.4.0 (64-bit)| (default, Oct 21 2015, 19:35:23) [MSC v.1500 64 bit (AMD64)]
IPython: 4.0.0
Matplotlib: 1.4.3
Seaborn: 0.6.0