2017-08-02 87 views
2

我無法完全找到這個問題的一致的答案或符合我的需求 - 我有一個文本文件的三列中的數據:X,Y和Z.列是選項卡, deliminated。我想用Python對這些數據進行熱圖表示,其中X和Y位置由Z中的值進行着色,範圍從0到1(X和Y的離散概率)。我正在嘗試seaborn的heatmap包和matplotlib的pcolormesh,但不幸的是這些需要2D數據陣列。XYZ陣列數據到熱圖

我的數據在1到37之間運行,常數爲y,然後在y中迭代0.1。 Y軸最大值波動基於所述數據集,但YMIN始終爲0。

[XYZ] ROW1 [1 ... 37 0.0000 Zvalue],ROW2 [1 ... 37 0.1000 Zvalue]等

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

下一步的任何提示?

+0

我知道你說你已經看了很多問題,但請看看[這一個](https://stackoverflow.com/a/45273661/5103802)。我前一段時間回答了這個問題,它似乎是你想要的,3個1D數組放入熱圖中。 –

+1

這絕對完美,謝謝! –

+0

@ViníciusAguiar - 是否有可能獲得更多的離散顏色(去除輪廓陰影)? –

回答

0

如果我理解正確的話,你有三列,X和Y表示值Z.

考慮下面這個例子的位置。有三列:X和Y包含位置信息(在這種情況下爲類別),Z包含着色熱圖的值。

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

然後我們創建這些列的數據幀和調換他們(這樣的x,y和z居然成爲列)。給列名稱並確保Z_value是一個數字。

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']) 

產生此數據幀。

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 

從這裏就不能創建一個熱圖,但是通過調用df.pivot('Y_value','X_value','Z_value')你轉動數據幀到可用於熱圖的形式。

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

生成的數據幀如下所示。

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 

您可以再喂pivottedsns.heatmap創建您的熱圖。

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

產生這個熱圖。

enter image description here

您可能需要做一些調整,代碼爲您的具體需求。但是因爲我沒有任何示例數據可以從我需要做出自己的例子。