我正在绘制一个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)
我明白了
图库中有a nice example绘制曲面和轮廓投影(下图)。我需要尽可能少地详细说明我的数据(以防止扭曲)。
我知道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
答案 0 :(得分:0)
你想要绘制一个完全覆盖所有数据点的表面,并且这样做直接&#34;直接&#34;没有平滑。
我最近用matplotlib创建了这个情节:
我不想声称它具有最小的平滑度#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=1
和cstride=1
。您可能想验证这一点。有更深入洞察力的人可能能够更好地解释这一点,在文档中它只是说步幅是采样长度。
答案 1 :(得分:0)
这是一篇旧文章,但是我认为可以使用 matplotlib 的triangulation支持来实现。尽管主题不同,请参见this问题中的mkTris()
函数。最终的表面图将三角形顶点放置在原始的不规则空间样本上。其余的绘制表面位于三角形面上。