gpt4 book ai didi

python - 使用最小插值绘制 3D 图

转载 作者:行者123 更新时间:2023-12-03 20:20:31 24 4
gpt4 key购买 nike

我正在绘制一个 3D 散点图,从文件中读取我的值。该文件的每一行都有 3 个坐标和一个标准偏差。让我们暂时将错误放在一边。

import os
import numpy as np
import matplotlib.pyplot as plt

input_file = os.path.normpath('C:/Users/sturaroa/Documents/my_file.tsv')

# read data from file
my_data = np.genfromtxt(input_file, delimiter='\t', skiprows=0)
X = my_data[:, 0] # 1st column
Y = my_data[:, 1] # 2nd column
Z = my_data[:, 2] # 3rd column
errors = my_data[:, 3] # 4th column (errors)

# draw 3D scatter graph
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.scatter(X, Y, Z)

我明白了
3d_scatter_plot

a nice example在绘制表面和轮廓投影的画廊中(下图)。我需要有一个类似的表示,同时尽可能少地阐述我的数据(以防止失真)。

contourf3d_demo2

我知道 this question解释如何从不规则的 3D 数据中获取 3D 表面。然而,它“平滑”了曲线,并插入到一组规则的点。我已经阅读了关于 griddata 的文档,它说它返回一个

2d float array - Array of values interpolated at (xi, yi) points.



不是我想要的。有人告诉我,我绝对需要进行插值才能找到曲面。 Ant 这可能是真的。其他一些人也告诉我插值不好,因为它会强制形成形状。这可能也是正确的(对于“插值”的大值)。

如何以最少的插值获得像样的 3D 图形?有没有像将最近的 3D 点链接在一起的东西?

顺便说一下,我的数据是相当规则的,就像它们被组织成一组 2D 平面或“切片”一样,但我想知道这是否可行,而无需做出这种假设。

这是一个示例文件,它与用于散点图的文件相同。它既简单又规律,如果可能的话,我建议测试更通用的。
2    1    2.0    0.0
2 2 82.666664 35.30187
2 3 100.0 0.0
2 4 98.0 4.472136
2 7 100.0 0.0
2 12 100.0 0.0
2 15 100.0 0.0
2 17 100.0 0.0
2 21 100.0 0.0
2 24 100.0 0.0
3 1 2.0 0.0
3 2 4.0 0.0
3 3 6.0 0.0
3 4 8.181818 0.60302263
3 7 15.090909 1.8683975
3 12 53.454544 33.6344
3 15 97.09091 3.9358494
3 17 97.09091 3.9358494
3 21 97.09091 3.3898242
3 24 97.09091 3.5058389
4 1 2.0 0.0
4 2 4.0 0.0
4 3 6.0 0.0
4 4 8.0 0.0
4 7 14.0 0.0
4 12 24.0 0.0
4 15 30.333334 0.74535596
4 17 37.666668 2.1343749
4 21 48.0 5.1639776
4 24 92.0 11.075499

更长 example input .前两列应该是 int最后两个是 float .

这是一个改进的加载,以防万一
# tell numpy the first 2 columns are int and the last 2 are floats
my_data = np.genfromtxt(infile, dtype=[('a', '<i8'), ('b', '<i8'), ('x', '<f8'), ('d', '<f8')])

# access columns by name
print(my_data["b"]) # column 1

最佳答案

您想绘制一个完全穿过所有数据点的表面,并且“直接”这样做而不会平滑。

我最近用 matplotlib 创建了这个图:
enter image description here

我不想声称它具有最小的“平滑度”,但至少它完全通过所有数据点。

我用了 plot_surface function from matplotlib .您可能还想使用 plot_wireframe

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(xGrid, yGrid, zGrid, rstride=1, cstride=1,cmap="autumn")

我认为部分技巧是设置 rstride=1cstride=1 .您可能想要验证这一点。有更深入见解的人可能能够更好地解释这一点,在文档中它只是说步幅是采样长度。

关于python - 使用最小插值绘制 3D 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29306902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com