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?


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)

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)

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)

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


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

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

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.


-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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.