我想使用(x,y,z)坐标和基于颜色的第四维度来创建与强度相关的分层热图。

每个与图层相关的数据都位于具有x,y,z和G列的文本文件中。定界符为空白。抱歉,如果显示不正确。

XA
200
600
1200
1800
2400
3000
200
600
1200
1800
2400
3000

YA
0
0
0
0
0
0
600
600
600
600
600
600

ZA
600
600
600
600
600
600
600
600
600
600
600
600

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

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轴上读取文本文件,创建和叠加热图?

最佳答案

假设您在与python脚本相同的文件夹中有两个txt文件,分别是data-z600.txt和data-z1200.txt,其内容完全相同

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




让我们导入所有必需的库

# 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参数作为目标。

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并获取每个文件第四维的极值。

# 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())


让我们创建(所有文件统一)色标

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


...最后制作/显示情节

# 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()


python - 将4D数据绘制为Python中的分层热图-LMLPHP

关于python - 将4D数据绘制为Python中的分层热图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54072839/

10-12 17:41
查看更多