【问题标题】:Plot 4D data as layered heatmaps in Python在 Python 中将 4D 数据绘制为分层热图
【发布时间】:2019-06-02 00:38:07
【问题描述】:

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

每个与图层相关的数据都位于一个文本文件中,其中包含 x、y、z 和 G 列。分隔符是空格。如果显示不正确,请致歉。

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

是的 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 轴创建和叠加热图?

【问题讨论】:

  • 您的高度是恒定的,即所有坐标的Z 设置为600。正常吗?如果是这样,您不需要第三维。
  • 感谢您的评论。 z 会改变。我有 4 个级别的数据,其中 Z = 0,然后是 600,然后是 1200,然后是 1800。对不起,我没有说清楚。

标签: python matplotlib 3d heatmap


【解决方案1】:

假设你有两个txt文件,分别是data-z600.txtdata-z1200.txt,和你的python脚本在同一个文件夹下,其内容完全一致

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

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

【讨论】:

  • 这正是我想要的——非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2019-11-06
相关资源
最近更新 更多