matplotlib / seaborn: primeira e última linha cortadas pela metade do mapa de calor

107

Ao plotar mapas de calor com animais do mar (e matrizes de correlação com matplotlib), a primeira e a última linha são cortadas pela metade. Isso também acontece quando executo este exemplo de código mínimo que encontrei online.

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()

E obter este resultado (não tenho permissão para incorporar imagens ainda) Os rótulos no eixo y estão no local correto, mas as linhas não estão completamente lá.

Há alguns dias, funcionou como planejado. Desde então, instalei o texlive-xetex, então o removi novamente, mas não resolveu meu problema.

Alguma ideia do que eu poderia estar perdendo?

Flops
fonte
1
Você pode fornecer os dados reais? Parece pequeno o suficiente
Mad Physicist
1
Geralmente, nossos limites de pixels são de -0,5 a + 0,5. Parece que os limites do eixo horizontal estão definidos corretamente, mas não o vertical. Você está mexendo com ylim em algum lugar?
Mad Physicist

Respostas:

94

Infelizmente, matplotlib 3.1.1 quebrou mapas de calor marítimos ; e em geral eixos invertidos com marcas fixas.
Isso foi corrigido na versão de desenvolvimento atual; você pode daqui

  • reverter para matplotlib 3.1.0
  • use matplotlib 3.1.2 ou superior
  • definir os limites do mapa de calor manualmente ( ax.set_ylim(bottom, top) # set the ylim to bottom, top)
ImportanceOfBeingErnest
fonte
Eu já vi essa pergunta, mas não estou familiarizado como reverter para matplotlib 3.1.0 ou definir os limites do mapa de calor manualmente (tentei isso, mas ainda truncado) e mal posso esperar pelo 3.1.2. Como eu poderia reverter para matplotlib 3.1.0?
SozDaneron
Depende de como você instalou o matplotlib. Por exemplo, via pip veja isso .
ImportanceOfBeingErnest
Certo, ainda sou novo no PyCharm. Descobri agora, obrigado.
SozDaneron
1
@ talha06 Não, quero dizer os limites do enredo. Se ax = sns.heatmap(...), defina ax.set_ylim(...)como você precisa que seus limites sejam.
ImportanceOfBeingErnest
2
Por 7 níveis eu tive que usar ax.set_ylim(0 ,7). Usando apenas ax.set_ylim (7) deixou uma linha dividida pela metade.
Dzamo Norton
81

É um bug na regressão matplotlib entre 3.1.0 e 3.1.1. Você pode corrigir isso:

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)
Nikhil Pakki
fonte
Isso, por exemplo, não funcionou comigo. Mas para ser justo, meu problema era diferente, pois uma linha inteira do mapa de calor estava faltando. Para mim, reverter a versão, como mencionei em um comentário acima, era a única saída.
Sidak
Funciona, embora pareça ilógico. Por que deveria bottomser maior do que top?
Eric Duminil
Funcionou para mim. plt.figure (figsize = (5,3)) ax = sn.heatmap (cm, annot = True, fmt = '') inferior, superior = ax.get_ylim () ax.set_ylim (inferior + 0,5, superior - 0,5) plt.xlabel ('Prediction') plt.ylabel ('Truth') plt.title ('Confusion Matrix')
MPJ567 de
18

Corrigido usando o acima e definindo os limites do mapa de calor manualmente.

Primeiro

ax = sns.heatmap(...

verificado os eixos atuais com

ax.get_ylim()
(5.5, 0.5)

Corrigido com

ax.set_ylim(6.0, 0)
Barbus
fonte
4

Resolvi isso adicionando esta linha em meu código, com matplotlib==3.1.1:

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

NB. A única razão pela qual isso funciona é porque o eixo x não foi alterado, então use por sua própria conta e risco com futuras versões mpl

Magnus Berg Sletfjerding
fonte
3

matplotlib 3.1.2 está disponível - Está disponível na nuvem Anaconda via conda-forge, mas não consegui instalá-lo via conda install. A alternativa manual funcionou: baixe matplotlib 3.1.2 do github e instale via 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
fonte
Não consigo atualizar o pacote. Recebi este erro: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
O acima foi tentado no MacOS. Não estou familiarizado com o cenário do Windows, mas parece que é um problema de permissão local.
rustyDev
Obrigado pela resposta. Acabei instalando a versão mais antiga (matplotlib-3.1.0).
Jade Cacho
0

Acontece com matplotlib versão 3.1.1, conforme sugerido pela importância de seringernest

Seguir resolveu meu problema

pip install matplotlib==3.1.0

rádio purushotam
fonte
0

rustyDev está certo sobre o conda-forge, mas eu não precisei fazer uma instalação pip manual a partir de um download do github. Para mim, no Windows, funcionou diretamente. E as tramas são boas novamente.

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

conda install -c conda-forge matplotlib

pontos opcionais, não necessários para a resposta:

Depois, tentei outras etapas, mas não são necessárias: No prompt do conda: conda search matplotlib --info não mostrou nenhuma informação de nova versão, a informação mais recente foi para 3.1.1. Portanto, tentei pip usando pip install matplotlib==3.1.2But pip diz "Requisito já satisfeito"

Então obter a versão de acordo com medium.com/@rakshithvasudev/… python - import matplotlib - matplotlib.__version__mostra que 3.1.2 foi instalado com sucesso

A propósito, eu tive esse erro diretamente após atualizar o Spyder para v4.0.0. O erro estava em um gráfico de uma matriz de confusão. Isso já foi mencionado há alguns meses. stackoverflow.com/questions/57225685/… que já está relacionado a esta questão marítima.

Lorenz
fonte
-1

conda install matplotlib = 3.1.0

Isso funcionou para mim e baixei o matplotlib de 3.1.1 para 3.1.0 e os mapas de calor começaram a se comportar corretamente

Sujit Bhattacharyya
fonte
-2

Resolvi esse problema com o seguinte código:

insira a descrição da imagem aqui

Juan Andres Nappa Severino
fonte
1
Essa resposta seria muito mais útil se o código real estivesse em texto em vez de em uma imagem.
DavidW