2016-07-18 8 views
-1

Ich habe einen DataFrame, der so aussieht, wenn er entstapelt.Pandas Seaborn Heatmap Fehler

Start Date 2016-07-11 2016-07-12 2016-07-13 
Period 
0    1.000000 1.000000   1.0 
1    0.684211 0.738095   NaN 
2    0.592105   NaN   NaN 

Ich versuche, es in Seaborn als Heatmap zu plotten, aber es gibt mir unbeabsichtigte Ergebnisse.

enter image description here

Hier ist mein Code:

import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 
df = pd.DataFrame(np.array(data), columns=['Start Date', 'Period', 'Users']) 
df = df.fillna(0) 
df = df.set_index(['Start Date', 'Period']) 
sizes = df['Users'].groupby(level=0).first() 
df = df['Users'].unstack(0).divide(sizes, axis=1) 
plt.title("Test") 
sns.heatmap(df.T, mask=df.T.isnull(), annot=True, fmt='.0%') 
plt.tight_layout() 
plt.savefig(table._v_name + "fig.png") 

Ich will es so, dass der Text nicht überlappt, und es gibt nicht mehr als 6 Wärme Legenden auf der Seite. Auch wenn möglich, wie kann ich das Datum so einstellen, dass es nur% Y-% m-% d anzeigt?

+0

Unbeabsichtigte Ergebnisse ist kein Fehler. – Parfait

+0

werde schwer sein, dies mit der 'data' Variablen –

+0

zu reproduzieren Bitte zeigen Sie ein * full * Beispiel oder wir können Ihnen nicht helfen. Basierend auf dem Plot und der Einrückung in Ihrem Beispiel sieht es so aus, als würden Sie eine Schleife bilden (und nicht jede Schleife eine neue Zahl erstellen, daher Ihr Problem), aber es ist eine Verschwendung unserer Zeit, zu raten, was Sie tun . – mwaskom

Antwort

1

Obwohl keine genau reproduzierbaren Daten verfügbar sind, sollten Sie die Verwendung von veröffentlichten Snippet-Daten berücksichtigen. In diesem Beispiel wird eine pivot_table() ausgeführt, um die Struktur zu erreichen, die mit StartDates über Spalten hinweg gebucht wird. Alles in allem gibt Ihre Heatmap möglicherweise die mehreren Farbbalken und überlappenden Zahlen aufgrund der unstack() Verarbeitung, wo Sie von Benutzern geteilt werden scheinen (in seaborn.FacetGrid zu teilen). So unten läuft das df wie durch heatmap. Auch eine apply() re-formatiert Datetime zu spezifizierten Bedarf.

from io import StringIO 
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
import seaborn as sns 

data = '''Period,StartDate,Value 
     0,2016-07-11,1.000000 
     0,2016-07-12,1.000000 
     0,2016-07-13,1.0 
     1,2016-07-11,0.684211 
     1,2016-07-12,0.738095 
     1,2016-07-13 
     2,2016-07-11,0.592105 
     2,2016-07-12 
     2,2016-07-13''' 

df = pd.read_csv(StringIO(data)) 
df['StartDate'] = pd.to_datetime(df['StartDate']) 
df['StartDate'] = df['StartDate'].apply(lambda x: x.strftime('%Y-%m-%d')) 

pvtdf = df.pivot_table(values='Value', index=['Period'], 
         columns='StartDate', aggfunc=sum) 
print(pvtdf) 
# StartDate 2016-07-11 2016-07-12 2016-07-13 
# Period          
# 0   1.000000 1.000000   1.0 
# 1   0.684211 0.738095   NaN 
# 2   0.592105   NaN   NaN 

sns.set()  
plt.title("Test") 
ax = sns.heatmap(pvtdf.T, mask=pvtdf.T.isnull(), annot=True, fmt='.0%') 
plt.tight_layout() 
plt.show() 

Heat Map Output