我想使用(x,y,z)坐标和基于颜色的第四维来创建与强度相关的分层热图。
I would like to create layered heatmaps using (x,y,z) coordinates and a fourth dimension, color-based, to correlate to intensity.
每个与图层相关的数据都位于一个带有x,y,z和G列的文本文件中。定界符为空白。抱歉,如果显示不正确。
Each layer-related data sits in a text file with columns of x, y, z and G. The delimiter is white space. Apologies if it does not present properly.
XA
200
600
1200
1800
2400
3000
200
600
1200
1800
2400
3000
XA20060012001800240030002006001200180024003000
YA
0
0
0
0
0
0
600
600
600
600
600
600
YA000000600600600600600600
ZA
600
600
600
600
600
600
600
600
600
600
600
600
ZA600600600600600600600600600600600600
GA
1.27
1.54
1.49
1.34
1.27
1.25
1.28
1.96
1.12
1.06
1.06
1.06
GA1.271.541.491.341.271.251.281.961.121.061.061.06
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
data = np.load(filename)
x = np.linspace(0,2400,num=6)
y = np.linspace(0,2400,num=11)
X,Y=np.meshgrid(x,y)
Z = data[:,:,0] * 1e-3
plt.contourf(X,Y,Z)
plt.colorbar()
如何阅读文本文件,创建和叠加文本沿Z轴的atmap?
推荐答案假设您有两个txt文件,即 data-z600 .txt 和 data-z1200.txt ,位于与python脚本相同的文件夹中,其内容完全相同
Say you have two txt files, namely data-z600.txt and data-z1200.txt, in the same folder as your python script, whose contents are exactly
data-z600.txt (您的用户)
XA YA ZA GA
200 0 600 1.27
600 0 600 1.54
1200 0 600 1.49
1800 0 600 1.34
2400 0 600 1.27
3000 0 600 1.25
200 600 600 1.28
600 600 600 1.96
1200 600 600 1.12
1800 600 600 1.06
2400 600 600 1.06
3000 600 600 1.06
和 data-z1200.txt (故意发明)
XA YA ZA GA
200 0 1200 1.31
600 0 1200 2
1200 0 1200 1.63
1800 0 1200 1.36
2400 0 1200 1.31
3000 0 1200 1.35
200 600 1200 1.38
600 600 1200 1.36
1200 600 1200 1.2
1800 600 1200 1.1
2400 600 1200 1.1
3000 600 1200 1.11
让我们导入所有必需的库
Let's import all the required libraries
# libraries
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import scipy.interpolate as si
from matplotlib import cm
import pandas as pd
import numpy as np
并定义 grids_maker
,该函数可以准备包含在给定文件中的数据的工作,此处通过 filepath
自变量。
and define grids_maker
, a function that does the job of preparing data contained in a given file, here targeted via the filepath
argument.
def grids_maker(filepath):
# Get the data
df = pd.read_csv(filepath, sep=' ')
# Make things more legible
xy = df[['XA', 'YA']]
x = xy.XA
y = xy.YA
z = df.ZA
g = df.GA
reso_x = reso_y = 50
interp = 'cubic' # or 'nearest' or 'linear'
# Convert the 4d-space's dimensions into grids
grid_x, grid_y = np.mgrid[
x.min():x.max():1j*reso_x,
y.min():y.max():1j*reso_y
]
grid_z = si.griddata(
xy, z.values,
(grid_x, grid_y),
method=interp
)
grid_g = si.griddata(
xy, g.values,
(grid_x, grid_y),
method=interp
)
return {
'x' : grid_x,
'y' : grid_y,
'z' : grid_z,
'g' : grid_g,
}
在文件列表中使用 grids_maker
并获取每个文件的第4维极值。
Let's use grids_maker
over our list of files and get the extrema of each file's 4th dimension.
# Let's retrieve all files' contents
fgrids = dict.fromkeys([
'data-z600.txt',
'data-z1200.txt'
])
g_mins = []
g_maxs = []
for fpath in fgrids.keys():
fgrids[fpath] = grids = grids_maker(fpath)
g_mins.append(grids['g'].min())
g_maxs.append(grids['g'].max())
创建我们的(所有文件统一的)色标
Let's create our (all-file unifying) color-scale
# Create the 4th color-rendered dimension
scam = plt.cm.ScalarMappable(
norm=cm.colors.Normalize(min(g_mins), max(g_maxs)),
cmap='jet' # see https://matplotlib.org/examples/color/colormaps_reference.html
)
...最后绘制/显示该图
... and finally make/show the plot
# Make the plot
fig = plt.figure()
ax = fig.gca(projection='3d')
for grids in fgrids.values():
scam.set_array([])
ax.plot_surface(
grids['x'], grids['y'], grids['z'],
facecolors = scam.to_rgba(grids['g']),
antialiased = True,
rstride=1, cstride=1, alpha=None
)
plt.show()
这篇关于将4D数据绘制为Python中的分层热图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!