X Y Z阵列数据到热图

时间:2017-08-02 20:58:17

标签: python arrays matplotlib heatmap seaborn

我无法找到这个问题或符合我需求的问题的共识答案 - 我在文本文件的三列中有数据:X,Y和Z.列是制表符分隔的。我想用Python制作这些数据的热图表示,其中X和Y位置用Z中的值着色,其范围从0到1(X和Y的离散概率)。我正在尝试使用seaborn的热图包和matplotlib的pcolormesh,但遗憾的是这些需要2D数据阵列。

对于常数y,我的数据通过X从1到37运行,然后在y中迭代0.1。 y max根据数据集波动,但ymin始终为0.

[X Y Z] 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")

有关后续步骤的提示吗?

1 个答案:

答案 0 :(得分:3)

如果我理解正确,你有三列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

然后,您可以将pivotted提供给sns.heatmap以创建热图。

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

导致此热图。

enter image description here

您可能需要对代码进行一些调整以满足您的确切需求。但是,由于我没有示例数据,我需要自己制作示例。

相关问题