【问题标题】:matplotlib/seaborn: first and last row cut in half of heatmap plotmatplotlib/seaborn:第一行和最后一行切成热图的一半
【发布时间】:2020-01-11 14:32:52
【问题描述】:

使用 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,所以我再次将其删除,但它并没有解决我的问题。

有什么我可能会遗漏的想法吗?

【问题讨论】:

  • 能否提供实际数据?它似乎足够小
  • 一般来说,我们的像素范围是 -0.5 到 size+0.5。看起来水平轴限制设置正确,但垂直轴不正确。你在哪里惹ylim?

标签: python matplotlib seaborn


【解决方案1】:

不幸的是 ma​​tplotlib 3.1.1 broke seaborn heatmaps;并且通常具有固定刻度的倒轴。
这在当前的开发版本中已修复;你可能会因此

  • 恢复为 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?
  • 这取决于你如何安装 matplotlib。例如。通过点子看到this
  • 对,我还是 PyCharm 的新手。现在想通了,谢谢。
  • @talha06 不,我的意思是情节限制。如果ax = sns.heatmap(...),请将ax.set_ylim(...) 设置为您需要的任何限制。
  • 对于 7 个级别,我必须使用 ax.set_ylim(0 ,7)。仅使用 ax.set_ylim(7) 将一行减半。
【解决方案2】:

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

第一

ax = sns.heatmap(...

检查当前坐标区
ax.get_ylim()
(5.5, 0.5)

固定为

ax.set_ylim(6.0, 0)

【讨论】:

    【解决方案3】:

    这是 matplotlib 3.1.0 和 3.1.1 之间回归中的一个错误 您可以通过以下方式更正此问题:

    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)
    

    【讨论】:

    • 例如,这对我不起作用。但公平地说,我的问题不同的是,热图的一整行都丢失了。正如我在上面的评论中提到的,对我来说,恢复版本是唯一的出路。
    • 它有效,尽管它看起来不合逻辑。为什么bottom 应该大于top
    • 为我工作。 plt.figure(figsize=(5,3)) ax = sn.heatmap(cm, annot=True, fmt='') bottom, top = ax.get_ylim() ax.set_ylim(bottom + 0.5, top - 0.5) plt.xlabel('预测') plt.ylabel('真相') plt.title('混淆矩阵')
    【解决方案4】:

    importanceofbeingernest 建议的 matplotlib 版本 3.1.1 会发生这种情况

    以下解决了我的问题

    pip install matplotlib==3.1.0

    【讨论】:

      【解决方案5】:

      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.
      • 以上是在MacOS下试过的。不熟悉 Windows 场景,但似乎是本地权限问题。
      • 感谢您的回复。我最终安装了旧版本(matplotlib-3.1.0)。
      【解决方案6】:

      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/... 这已经链接到这个 seaborn 问题。

      【讨论】:

        【解决方案7】:

        我通过在我的代码中添加这一行来解决它,matplotlib==3.1.1

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

        注意。唯一可行的原因是 x 轴没有改变,因此在未来的 mpl 版本中使用风险自负

        【讨论】:

          【解决方案8】:

          为我工作:

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

          【讨论】:

            【解决方案9】:

            降级你的 matplotlib

            !pip install matplotlib==3.1.0
            

            并将这一行添加到您的绘图代码中:

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

            【讨论】:

              【解决方案10】:

              正如@ImportanceOfBeingErnest 提到的,这个问题是由于特定版本的matplotlib 中损坏的seaborn heatmaps 所以解决这个问题的简单方法是升级matplotlib,如下所示:

              pip install --upgrade matplotlib
              

              【讨论】:

              • 这如何在线程中添加任何内容?
              • 看@ImportanceOfBeingErnest 提出的三个解决方案,首先恢复到较低版本并不好。第三个需要更改在这种情况下不需要的代码,第二个解决方案需要读者考虑安装哪个版本。最后也是最重要的,人们不想在这里阅读冗长的解释,他们只想跳到解决方案/代码部分。这个答案是问题的直接解决方案。我希望能解释,否则我很乐意删除。
              • 我看不出“使用 matplotlib 3.1.2 或更高版本”有什么不清楚的地方,我不同意“人们不想在这里阅读冗长的解释,他们只想跳到解决方案/代码部分。”此外,接受的答案很短。这个帖子已经有太多的答案了。
              猜你喜欢
              相关资源
              最近更新 更多