matplotlib / seaborn:热图图的第一行和最后一行被切成两半


107

用seaborn(和matplotlib关联矩阵)绘制热图时,第一行和最后一行被切成两半。当我运行这个在网上找到的最小代码示例时,也会发生这种情况。

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

data = pd.read_csv('https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv')
plt.figure(figsize=(10,5))
sns.heatmap(data.corr())
plt.show()

并获得此结果(目前还不允许我嵌入图像) y轴上的标签在正确的位置,但是行并不完全在此处。

几天前,它按预期工作。从那时起,我安装了texlive-xetex,因此我再次将其删除,但是并不能解决我的问题。

有什么想法我可能会错过吗?


1
您能提供实际数据吗?似乎足够小
疯狂物理学家,

1
通常,我们的像素范围是-0.5到size + 0.5。看起来水平轴限制已正确设置,但垂直轴未正确设置。您在任何地方都与ylim混为一谈吗?
疯狂物理学家

Answers:


94

不幸的是,matplotlib 3.1.1 打破了海洋热图;并通常使用固定刻度的倒轴。
在当前的开发版本中已修复此问题。你可能因此

  • 恢复到matplotlib 3.1.0
  • 使用matplotlib 3.1.2或更高版本
  • 手动设置热图限制(ax.set_ylim(bottom, top) # set the ylim to bottom, top

我已经解决了这个问题,但是不熟悉如何还原回matplotlib 3.1.0或手动设置热图限制(尝试过但仍被截断)并且无法等待3.1.2。如何恢复为matplotlib 3.1.0?
SozDaneron

这取决于您如何安装matplotlib。例如通过点子看到这一点
ImportanceOfBeingErnest

是的,我还是PyCharm的新手。现在想通了,谢谢。
SozDaneron

1
@ talha06不,我是说情节限制。如果为ax = sns.heatmap(...),则将其设置ax.set_ylim(...)为您需要的限制。
ImportanceOfBeingErnest

2
对于7个级别,我不得不使用ax.set_ylim(0 ,7)。仅使用ax.set_ylim(7)可以将一行减半。
Dzamo Norton

81

这是3.1.0和3.1.1之间的matplotlib回归中的错误,您可以通过以下方法更正此错误:

import seaborn as sns
df_corr = someDataFrame.corr()
ax = sns.heatmap(df_corr, annot=True) #notation: "annot" not "annote"
bottom, top = ax.get_ylim()
ax.set_ylim(bottom + 0.5, top - 0.5)

例如,这对我没有用。但公平地说,我的问题有所不同,因为缺少了整个热图行。正如我在上面的评论中提到的那样,对我来说,还原版本是唯一的出路。
Sidak

即使看起来不合逻辑,它仍然有效。为什么要bottom大于top
埃里克·杜米尼尔

为我工作。plt.figure(figsize =(5,3))ax = sn.heatmap(cm,annot = True,fmt ='')底部,顶部= ax.get_ylim()ax.set_ylim(底部+ 0.5,顶部-0.5) plt.xlabel('Prediction')plt.ylabel('Truth')plt.title('Confusion Matrix')
MPJ567

18

已使用上述方法修复并手动设置了热图限制。

第一

ax = sns.heatmap(...

检查当前轴

ax.get_ylim()
(5.5, 0.5)

固定于

ax.set_ylim(6.0, 0)

4

我通过在代码中添加以下行来解决了这一问题matplotlib==3.1.1

ax.set_ylim(sorted(ax.get_xlim(), reverse=True))

注意 起作用的唯一原因是因为x轴未更改,因此使用未来的mpl版本需要您自担风险


3

matplotlib 3.1.2已发布-可通过conda-forge在Anaconda云中找到,但我无法通过conda install进行安装。手动替代方法可行:从github下载matplotlib 3.1.2并通过pip安装

 % curl https://codeload.github.com/matplotlib/matplotlib/tar.gz/v3.1.2 --output matplotlib-3.1.2.tar.gz
 % pip install matplotlib-3.1.2.tar.gz

我无法更新软件包。我收到此错误:ERROR: Could not install packages due to an EnvironmentError: [WinError 5] Access is denied: 'c:\\users\\w-book\\anaconda3\\lib\\site-packages\\matplotlib\\backends\\_backend_agg.cp37-win_amd64.pyd' Consider using the --user option or check the permissions.
Jade Cacho

以上已在MacOS中尝试过。不熟悉Windows方案,但似乎是本地权限问题。
rustyDev

感谢您的答复。我最终安装了旧版本(matplotlib-3.1.0)。
Jade Cacho


0

rustyDev关于conda-forge是正确的,但是我不需要从github下载进行手动pip安装。对我来说,在Windows上,它可以直接工作。而且情节都很好。

https://anaconda.org/conda-forge/matplotlib

conda install -c conda-forge matplotlib

可选点,答案不需要:

之后,我尝试了其他步骤,但没有必要:在conda提示符下:conda search matplotlib --info未显示新版本信息,最新信息为3.1.1。因此,我尝试使用pip进行尝试,pip install matplotlib==3.1.2但是pip说“要求已经满足”

然后根据medium.com/@rakshithvasudev/…获取版本,python - import matplotlib - matplotlib.__version__表明3.1.2已成功安装。

顺便说一句,将Spyder更新到v4.0.0后,我直接遇到了此错误。误差在混淆矩阵图中。几个月前已经提到过这一点。stackoverflow.com/questions/57225685/…已经与这个棘手的问题相关联。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.