X Y Z 数组数据到热图
X Y Z array data to heatmap
对于这个问题或符合我需要的问题,我找不到一致的答案 -- 我在文本文件的三列中有数据:X、Y 和 Z。列以制表符分隔。我想用 Python 对这些数据进行热图表示,其中 X 和 Y 位置被 Z 中的值遮蔽,Z 的范围从 0 到 1(X 和 Y 的离散概率)。我正在尝试 seaborn 的热图包和 matplotlib 的 pcolormesh,但不幸的是这些需要二维数据数组。
我的数据通过 X 从 1 到 37 遍历常数 y,然后在 y 中迭代 0.1。 y max 根据数据集波动,但 ymin 始终为 0.
[X Y Z] 行 1[1...37 0.0000 Z 值],行 2[1...37 0.1000 Z 值] 等
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")
对后续步骤有什么建议吗?
如果我理解正确的话,你有三列 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')
生成此热图。
您可能需要根据您的具体需要对代码进行一些调整。但是由于我没有示例数据可供参考,所以我需要制作自己的示例。
对于这个问题或符合我需要的问题,我找不到一致的答案 -- 我在文本文件的三列中有数据:X、Y 和 Z。列以制表符分隔。我想用 Python 对这些数据进行热图表示,其中 X 和 Y 位置被 Z 中的值遮蔽,Z 的范围从 0 到 1(X 和 Y 的离散概率)。我正在尝试 seaborn 的热图包和 matplotlib 的 pcolormesh,但不幸的是这些需要二维数据数组。
我的数据通过 X 从 1 到 37 遍历常数 y,然后在 y 中迭代 0.1。 y max 根据数据集波动,但 ymin 始终为 0.
[X Y Z] 行 1[1...37 0.0000 Z 值],行 2[1...37 0.1000 Z 值] 等
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")
对后续步骤有什么建议吗?
如果我理解正确的话,你有三列 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')
生成此热图。
您可能需要根据您的具体需要对代码进行一些调整。但是由于我没有示例数据可供参考,所以我需要制作自己的示例。