Matplotlib/seborn: 第一行和最后一行分割成热图小区的一半

当用 seborn 绘制热图(以及用 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()

And get this result (I am not allowed to embed images yet) Y 轴上的标签位于正确的位置,但是行并不完全在那里。

几天前,它还能正常工作。从那时起,我安装了 texlive-xetex,所以我再次删除它,但它没有解决我的问题。

知道我会错过什么吗?

53909 次浏览

不幸的是,Matplotlib 3.1.1 < a href = “ https://github.com/matplotlib/issues/14675”rel = “ noReferrer”> broke seborn Heat map ; 和一般的倒轴与固定的刻度。
这在当前的开发版本中是固定的; 因此,您可以

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

固定使用上述和手动设置热图限制。

首先

ax = sns.heatmap(...

检查当前轴

ax.get_ylim()
(5.5, 0.5)

修好了

ax.set_ylim(6.0, 0)

在3.1.0和3.1.1之间的 matplotlib 回归中,这是一个 bug 你可以通过以下方法来纠正:

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)

正如 生存的重要性所建议的那样,matplotlib 版本3.1.1就是如此

跟踪解决了我的问题

pip install matplotlib==3.1.0

Matplotlib 3.1.2已经过时了 它可以通过 conda-forge 在 Anaconda 云中获得,但是我无法通过 conda 安装来安装它。 人工操作的替代方法奏效了: 从 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

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 install matplotlib==3.1.2的 pip,但 pip 说“需求已经满足”

然后根据 medium.com/@rakshithvasudev/得到版本... ... python - import matplotlib - matplotlib.__version__显示成功安装了3.1.2

顺便说一下,在将 Spyder 更新到 v4.0.0之后,我直接出现了这个错误。这个错误是一个混淆矩阵的阴谋。几个月前就有人提过了。Stackoverflow.com/questions/57225685/ ... 已经和这个海运问题有关了。

我通过在代码中加入这一行,用 matplotlib==3.1.1解决了这个问题:

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

注意。这样做的唯一原因是因为 x 轴没有改变,所以在将来的 mpl 版本中使用它要承担风险

对我有用:

b, t = plt.ylim()
b += 0.5
t -= 0.5
custom_ylim = (b, t)
plt.setp(axes, ylim=custom_ylim)

降级你的 matplotlib

!pip install matplotlib==3.1.0

然后把这一行添加到你的情节代码中:

ax[i].set_ylim(sorted(ax[i].get_xlim(), reverse=True))
 

正如@Import anceOfBeingErnest 所提到的,这个问题是由于 matplotlib 的特定版本中的海运热图出现故障造成的,因此对这个问题的简单解决方案是对 matplotlib 进行如下升级:

pip install --upgrade matplotlib