用最小插值绘制3D绘图

时间:2015-03-27 17:41:44

标签: python numpy matplotlib 3d

我正在绘制一个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 - 在(xi,yi)点插值的值数组。

不是我想要的。有些人告诉我,我绝对需要插值才能找到一个表面。蚂蚁可能是真的。其他人也告诉我插值不好,因为它会强制形状。这可能也是正确的(对于"插值"的大值)。

如何以最少的插值获得合适的3D图形?是否只是将最近的3D点链接在一起?

顺便说一句,我的数据是相当规律的,就像它们被组织成一组2D平面,或者#34;切片",但是我想知道这是否可行而不做到假设

这是一个示例文件,它与散点图的使用方法相同。它是简单而有规律的,如果可能的话,我建议对更一般的测试。

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。前2列应为int,最后2列为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

2 个答案:

答案 0 :(得分:0)

你想要绘制一个完全覆盖所有数据点的表面,并且这样做直接&#34;直接&#34;没有平滑。

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

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

我使用了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。您可能想验证这一点。有更深入洞察力的人可能能够更好地解释这一点,在文档中它只是说步幅是采样长度。

答案 1 :(得分:0)

这是一篇旧文章,但是我认为可以使用 matplotlib triangulation支持来实现。尽管主题不同,请参见this问题中的mkTris()函数。最终的表面图将三角形顶点放置在原始的不规则空间样本上。其余的绘制表面位于三角形面上。