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をどこかでいじっていますか?
Mad Physicist

回答:


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のインストール方法によって異なります。たとえば、pipを介してこれを参照してください。
ImportanceOfBeingErnest

ええ、私はまだPyCharmが初めてです。今、それを理解しました、ありがとう。
SozDaneron、

1
@ talha06いいえプロット限界を意味します。の場合はax = sns.heatmap(...)ax.set_ylim(...)制限が必要なものに設定します。
ImportanceOfBeingErnest

2
7つのレベルのために私は使用しなければなりませんでしたax.set_ylim(0 ,7)。ax.set_ylim(7)だけを使用すると、1行が半分になります。
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ですか?
Eric Duminil、

私のために働いた。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( '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))

NB。これが機能する唯一の理由は、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)をインストールしてしまいました。
ジェイドカチョ


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 install matplotlib==3.1.2、ピップは「要件はすでに満たされています」

次に、medium.com / @ rakshithvasudev /…に従ってバージョンを取得します。 python - import matplotlib - matplotlib.__version__、3.1.2が正常にインストールされたことが示されます

ところで、Spyderをv4.0.0にアップデートした直後にこのエラーが発生しました。エラーは、混同行列のプロットにありました。これは数ヶ月前にすでに言及されました。stackoverflow.com/questions/57225685/…これは、この海の問題にすでにリンクされています。


-1

conda install matplotlib = 3.1.0

これは私のために機能し、matplotlibを3.1.1から3.1.0にダウングレードし、ヒートマップが正しく動作し始めました


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.