2017-08-02 1 views
2

Ich konnte nicht eine Konsensantwort für diese Frage finden oder eine, die meinen Bedürfnissen entspricht - ich habe Daten in drei Spalten einer Textdatei: X, Y und Z. Spalten sind Tab- abgegrenzt. Ich würde gerne eine Heatmap-Darstellung dieser Daten mit Python machen, wo X- und Y-Positionen durch den Wert in Z schattiert werden, der von 0 bis 1 reicht (eine diskrete Wahrscheinlichkeit von X und Y). Ich habe Seaborns Heatmap-Paket und Matplotlibs Pcolormesh getestet, aber diese benötigen leider 2D-Datenfelder.XYZ-Array-Daten in Heatmap

Meine Daten durchlaufen X von 1 bis 37 für konstante y und iteriert dann um 0.1 in y. y max fluktuiert auf der Datensatz basiert, aber ymin ist immer 0.

[XYZ] row1 [1 ... 37 0,0000 zwert], row2 [1 ... 37 0,1000 zwert] usw.

import numpy as np 
from numpy import * 
import pandas as pd 
import seaborn as sns 
sns.set() 

df = np.loadtxt(open("file.txt", "rb"), delimiter="\t").astype("float") 

Irgendwelche Tipps für die nächsten Schritte?

+0

Ich weiß, Sie sagten, Sie haben eine Menge Fragen untersucht, aber bitte schauen Sie sich [diese] an (https://Stackoverflow.com/a/45273661/5103802). Ich habe das vor einer Weile geantwortet, es scheint so zu sein, was du willst, 3 1D-Arrays in eine Heatmap. –

+1

Das ist absolut perfekt, danke! –

+0

@ ViníciusAguiar - wäre es möglich, mehr diskrete Farben zu erhalten (entfernen Sie die Konturenschattierung)? –

Antwort

0

Wenn ich Sie richtig verstanden haben Sie drei Spalten mit X und Y die Position eines Wertes Z bezeichnet

das folgende Beispiel. Es gibt drei Spalten: X und Y enthalten Positionsinformationen (in diesem Fall Kategorien) und Z enthält die Werte für die Schattierung der Heatmap.

x = np.array(['a','b','c','a','b','c','a','b','c']) 
y = np.array(['a','a','a','b','b','b','c','c','c']) 
z = np.array([0.3,-0.3,1,0.5,-0.25,-1,0.25,-0.23,0.25]) 

Dann erstellen wir einen Datenrahmen aus diesen Spalten und sie umzusetzen (also x, y und z tatsächlich Spalten werden). Geben Sie Spaltennamen an und stellen Sie sicher, dass Z_value eine Zahl ist.

df = pd.DataFrame.from_dict(np.array([x,y,z]).T) 
df.columns = ['X_value','Y_value','Z_value'] 
df['Z_value'] = pd.to_numeric(df['Z_value']) 

Ergebnis in diesem Datenrahmen.

X_value Y_value Z_value 
0 a a 0.30 
1 b a -0.30 
2 c a 1.00 
3 a b 0.50 
4 b b -0.25 
5 c b -1.00 
6 a c 0.25 
7 b c -0.23 
8 c c 0.25 

Daraus Sie eine Heatmap nicht schaffen können, aber durch df.pivot('Y_value','X_value','Z_value') rufen Sie an den Datenrahmen in eine Form schwenken, die für eine Heatmap verwendet werden können.

pivotted= df.pivot('Y_value','X_value','Z_value') 

Der resultierende Datenrahmen sieht so aus.

X_value a b c 
Y_value   
a 0.30 -0.30 1.00 
b 0.50 -0.25 -1.00 
c 0.25 -0.23 0.25 

können Sie dann pivotted zum sns.heatmap füttern Ihre Heatmap zu erstellen.

sns.heatmap(pivotted,cmap='RdBu') 

Ergebnis in dieser Heatmap.

enter image description here

Sie können einige Anpassungen an den Code für Ihre genauen Bedürfnisse vornehmen müssen. Aber da ich keine Beispieldaten hatte, um davon zu kommen, musste ich mein eigenes Beispiel machen.