2015-12-19 30 views
7

ten kod:Błąd Seaborn? Niespójne w mapę cieplną wykreślania

%matplotlib inline 

#import numpy as np; np.random.seed(0) 
import matplotlib.pyplot as plt 
import seaborn as sns #; sns.set() 

flights = sns.load_dataset("flights") 
flights = flights.pivot("month", "year", "passengers") 

sns.heatmap(flights, annot=True, linewidths=.2, fmt="d") 

#plt.show() 

dostanie rezultat wygląda the official result (See/verify it here):

enter image description here

Jednakże, jeśli wyłączyć wykreślanie inline i włączyć plt.show() wynik będzie wyglądać następująco:

Annotated heatmaps?

Np., adnotacja zniknęła, z wyjątkiem sytuacji, gdy jedna komórka i orientacja etykiety y są nieprawidłowe, jeśli wbudowane drukowanie jest wyłączone. Ponieważ jest to jedyna zmiana, którą wprowadziłem, myślę, że jest to błąd z seaborn, że nie może uzyskać spójnych wyników.

Czy ktoś może to potwierdzić, proszę?
Czy jest możliwa poprawka?

Update, dzięki Sergey dla jego opinie, tutaj są moje wersje wszystkiego istotne:

Python: 3.5.0 |Anaconda 2.4.0 (64-bit)| (default, Dec 1 2015, 11:46:22) [MSC v.1900 64 bit (AMD64)] 
IPython: 4.0.0 
Matplotlib: 1.5.0 
Seaborn: 0.6.0 

Więc myślę, że jest to albo Python3 lub matplotlib: 1.5, który jest przyczyną problemu. Na wszelki wypadek dodam tag Python3.

Dzięki

Odpowiedz

0

Dla mnie kod produkuje ten sam wynik niezależnie od tego, czy używam %matplotlib inline i uczynić go plt.show(), bez robaków przestrzegane.

Sprawdź swoje wersje wszystkiego istotne:

import sys 
print 'Python: ' + sys.version 

import IPython 
print 'IPython: ' + IPython.__version__ 

import matplotlib 
print 'Matplotlib: ' + matplotlib.__version__ 

import seaborn 
print 'Seaborn: ' + seaborn.__version__ 

Moje wersje dla odniesienia:

Python: 2.7.10 |Anaconda 2.4.0 (64-bit)| (default, Oct 21 2015, 19:35:23) [MSC v.1500 64 bit (AMD64)] 
IPython: 4.0.0 
Matplotlib: 1.4.3 
Seaborn: 0.6.0 
3

Ten błąd został faktycznie prezentowane na stronie Seaborn GitHub here. Z tamtejszych komentarzy wynika, że ​​problem pojawia się, gdy matplotlib używa backendów MacOSX, TkAgg lub QtAgg (również przy użyciu %matplotlib notebook w notatniku IPython/Jupyter).

Zasadniczo zmiana backendu na inną powinna sprawić, że działka będzie działała zgodnie z oczekiwaniami (jak widać na pierwszej ilustracji). Od matplotlib's documentation, można sprawdzić co backend korzystasz z

matplotlib.get_backend() 

i zmienić go na inny z

matplotlib.use() 

Niestety, wydaje się, że problem ten pojawia się ze wszystkimi dostępnymi interaktywnymi backendów. Jeśli tego właśnie potrzebujesz, prawdopodobnie będziesz musiał poczekać, aż błąd zostanie rozwiązany (możesz śledzić wszelkie postępy w tej sprawie na stronie GitHub).

Jeśli jesteś zadowolony produkujących plik PNG/PDF zamiast interaktywne okno do swojej działce, Agg backend powinien działać prawidłowo z niewielką zmianą kodu:

import matplotlib 
matplotlib.use("Agg") 

import matplotlib.pyplot as plt 
import seaborn as sns #; sns.set() 

flights = sns.load_dataset("flights") 
flights = flights.pivot("month", "year", "passengers") 

sns.heatmap(flights, annot=True, linewidths=.2, fmt="d") 

plt.savefig("heatmap.png") 
+0

Thanks Pablo. Używam Windows7, a moim interaktywnym zapleczem jest 'QtAgg'. Niestety, podobnie jak w przypadku kyleabeauchamp, "TkAgg i QT4Agg mają takie samo zachowanie w pojedynczej komórce co OSX". Ja też nie mam szczęścia. – xpt

+1

@xpt Tak, masz rację, że 'MacOSX' nie jest jedynym backendem, który produkuje ten błąd. Potwierdziłem to również dla 'QtAgg' i' TkAgg' na Linux. Jeśli jesteś zadowolony z zapisania do pliku PNG/PDF, działa funkcja "Agg". Niestety, nie znam innego interaktywnego backendu, z którego mógłbyś skorzystać, prawdopodobnie będziemy musieli poczekać, aż błąd seaborn/matplotlib zostanie rozwiązany. Zaktualizuję odpowiedź za pomocą tych informacji. –

+0

Tak, to działa. ** Dzięki **, ponieważ 'use (" Agg ")' jest nieudokumentowane i nie mogę go znaleźć. Otrzymam +1 od tego i +1 i przyjmuję dalej, gdy błąd seaborn/matplotlib zostanie rozwiązany, a ty zaktualizujesz swoją odpowiedź. – xpt