【发布时间】:2021-05-15 08:33:32
【问题描述】:
嘿,我怎样才能在 3D 中绘制 2D 热图?现在我创建了一个 python 脚本来使用来自 CSV 的数据(CSV 格式:x、y、z、v)制作一个 2D 热图。 例如:
第一个 csv
0,000;-110,000;110,000;0,101
第二个 csv
0,000;-66,000;110,000;0,104
第三个 csv
0,000;-22,000;110,000;0,119
....
在此示例中,它是 xz 平面中的热图,我创建了例如另外五个图,这样我就可以在 3D 房间中插入六个 xz 平面图。 在4D heatmap plot with matplotlib 中有一个很好的例子。但我不知道如何在我的情况下使用它。
import numpy as np
import os
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
'Create a list for every parameter'
x = []
y = []
z = []
v = []
file_path = "path/."
'Insert data from csv into lists'
for root, dirs, files in os.walk(file_path, topdown=False):
for name in files:
if name[-4:] != '.csv': continue
with open(os.path.join(root, name)) as data:
data = np.genfromtxt((line.replace(',', '.') for line in data), delimiter=";")
if data[1] == 22:
x.append(data[0])
y.append(data[1])
z.append(data[2])
v.append(data[3])
'Create axis data'
xi = np.linspace(min(x), max(x), 1000)
zi = np.linspace(min(z), max(z), 1000)
vi = griddata((x, z), v, (xi[None,:], zi[:,None]), method='cubic')
'Create the contour plot'
CS = plt.contourf(xi, zi, vi, 20, cmap=plt.cm.rainbow)
plt.title("Heatmap xz-plane", y=1.05,
fontweight="bold")
plt.xlabel("length x in cm")
plt.xticks(np.arange(0, 201, step=40))
plt.ylabel("height z in cm")
plt.yticks(np.arange(110, 251, step=20))
cbar = plt.colorbar()
cbar.set_label("velocity v in m/s", labelpad=10)
plt.savefig('testplot.png', dpi=400)
plt.show()
满足@keepAlive 的请求,希望看到他未经测试的答案的结果...:
实际上效果很好:-)
【问题讨论】:
-
所有数据文件的结构是否相同?我认为向我们展示您的数据的外观可能有助于我们弄清楚您想要实现的目标。否则,很难说出你在做的时候到底在想什么,例如。
data[1] == 22.... 在这个问题上可能还有更好的方法。 -
是的,所有 csv 文件的结构为:
x;y;z;v。但每个参数只有一个数据(一行)。每个 csv 文件都有以下输入,例如50,0;80,0;120,0;1,536。if data[1] == 22的 if 语句就是一个例子,因为原始代码要长得多,但对函数不感兴趣 -
好的。我已经更新了我的问题并插入了三个 csv 文件的数据。还是您需要更多?
-
嘿@nico.wagner 我真的很好奇您的帐户为何被删除。可能有一天你会看到这条评论,然后回复我……