我正在绘制一个三维散点图,从文件中读取数值。该文件的每一行都有三个坐标和一个标准偏差。暂时不考虑误差。
我得到了这个 画廊中有一个很好的例子,可以绘制表面和等高线的投影(如下图所示)。 我需要尽可能少地处理我的数据,以避免失真,并获得类似的表示形式。 我知道这个问题,它解释了如何从不规则的3D数据中获得3D表面。然而,它“平滑”了曲线,并插值到一组常规点。我已经阅读了griddata文档,它返回一个二维浮点数组-在(xi, yi)点插值的值数组。这不是我想要的。有些人告诉我,我绝对需要插值才能找到表面。这可能是真的。也有人告诉我插值是不好的,因为它会强制形状。这也可能是真的(对于大量的“插值”)。如何使用最小的插值获得体面3D图形?是否有像链接最近的3D点之类的东西?顺便说一下,我的数据相当规则,就像它们被组织成一组2D平面或“切片”,但我想知道如果没有做出这种假设是否可能。
这是一个示例文件,与散点图使用的相同。它简单而规则,如果可能的话,建议在更一般的文件上进行测试。
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数据中获得3D表面。然而,它“平滑”了曲线,并插值到一组常规点。我已经阅读了griddata文档,它返回一个二维浮点数组-在(xi, yi)点插值的值数组。这不是我想要的。有些人告诉我,我绝对需要插值才能找到表面。这可能是真的。也有人告诉我插值是不好的,因为它会强制形状。这也可能是真的(对于大量的“插值”)。如何使用最小的插值获得体面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
更长的示例输入。前两列应该是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