如何使用双入口表在3D中绘图 - Matplotlib

时间:2018-05-18 16:28:42

标签: python pandas matplotlib

我想在3D中使用Pandas / MatplotLib(线框或其他,我不在乎),但以特定方式绘制..

我正在使用RFID传感器,我正在尝试记录我在不同距离+不同角度接收的信号。我希望看到距离上升与角度之间的相关性。

这就是我想用3D绘图的原因:

X轴 - >距离,Y轴 - >角度,Z轴 - >收到的信号意味着浮动

我生成DataFrame的CSV文件的组织方式如下:双重输入表:

Distance;0;23;45;90;120;180
0;-53.145;-53.08;-53.1;-53.035;-53.035;-53.035
5;-53.145;-53.145;-53.05;-53.145;-53.145;-53.145
15;-53.145;-53.145;-53.145;-53.145;-53.145;-53.145
25;-53.145;-52.145;-53.145;-53.002;-53.145;-53.145
40;-53.145;-53.002;-51.145;-53.145;-54.255;-53.145
60;-53.145;-53.145;-53.145;-53.145;-53.145;-53.145
80;-53.145;-53.145;-53.145;-53.145;-60;-53.145
100;-53.145;-52;-53.145;-54;-53.145;-53.145
120;-53.145;-53.145;-53.145;-53.145;-53.002;-53.145
140;-51.754;-53.145;-51.845;-53.145;-53.145;-53.145
160;-53.145;-53.145;-49;-53.145;-53.145;-53.145
180;-53.145;-53.145;-53.145;-53.145;-53.145;-53.002
200;-53.145;-53.145;-53.145;-53.145;-53.145;-53.145

在第一个标签行上我们有不同的角度:0°,23°,45°,...... 而DataFrame的索引是距​​离:0厘米,15厘米......

内部的矩阵表示信号,因此,Z轴的值......

但我不知道如何生成3D Scatter,WireFrame ...因为在每个教程中我都看到使用特定列作为轴的人。

的确,在我第一行的CSV文件中,我有所有列的标签

Distance;0  ;23 ;45 ;90 ;120;180

我不知道如何使用双重输入表生成3D绘图。

你知道怎么做吗?或者,以更好的方式生成我的CSV文件,以便在最后看到相同的结果!

如果你能帮助我,我将不胜感激!

谢谢!

3 个答案:

答案 0 :(得分:1)

也许contour就足够了

b = np.array([0,5,15,25,40,60,80,100,120,140,160,180,200])
a = np.array([0,23,45,90,120,180])
x, y = np.meshgrid(a, b)
z = np.random.randint(-50,-40, (x.shape))

scm = plt.contourf(x, y, z, cmap='inferno')
plt.colorbar(scm)
plt.xticks(a)
plt.yticks(b)
plt.xlabel('Distance')
plt.ylabel('Angle')
plt.show()

显示器

enter image description here

答案 1 :(得分:1)

你可以用这样的东西得到一个等高线图(但是对于显示的数据,它不是很有趣,因为所有的值都是-45的常数):

library(h2o)
h2o.init()
df <- h2o.importFile("http://s3.amazonaws.com/h2o-public-test-data/smalldata/airlines/allyears2k_headers.zip")
model <- h2o.gbm(model_id = "model",
                 training_frame = df,
                 x = c("Year", "Month", "DayofMonth", "DayOfWeek", "UniqueCarrier"),
                 y = "IsDepDelayed",
                 max_depth = 3,
                 ntrees = 5)
h2o.download_mojo(model, getwd(), FALSE)

# Now download the latest stable h2o release from http://www.h2o.ai/download/
# and run the PrintMojo tool from the command line.
#
# (For MacOS: brew install graphviz)
# java -cp h2o.jar hex.genmodel.tools.PrintMojo --tree 0 -i model.zip -o model.gv
# dot -Tpng model.gv -o model.png
# open model.png

答案 2 :(得分:1)

欢迎使用stackoverflow,您的问题可分为几个步骤:

第1步 - 读取数据

我已将您的数据存储在名为data.txt的文件中。

我不太了解Pandas,但这也可以通过名为loadtxt的Numpy的简单函数来处理。由于第一列和第一行中的文本“距离”值,您的数据有点问题。但是不要惊慌我们将文件加载为字符串矩阵:

raw_data = np.loadtxt('data.txt', delimiter=';', dtype=np.string_)

第2步 - 转换原始数据

要从原始数据中提取所需数据,我们可以执行以下操作:

angle    = raw_data[0 , 1:].astype(float)
distance = raw_data[1:, 0 ].astype(float)
data     = raw_data[1:, 1:].astype(float)

使用indexing原始数据,我们选择了我们想要的数据,并使用astype我们将字符串值更改为数字。

中级步骤 - 使数据更有趣

你的数据有点无聊,只有价值-45,我冒昧地让它变得有点漂亮:

data = (50 + angle[np.newaxis,:]) / (10 + np.sqrt(distance[:,np.newaxis])) 

第4步 - 制作线框图

matplotlib.org的示例看起来很简单:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z)
plt.show()

但诀窍是让X, Y, Z参数正确...

第3步 - 制作XY数据

Z数据只是我们的data值:

Z = data

XY也应该是2D数组,以便plot_wireframe可以找到2D数组中Z的每个值的x和y {{1}在同一个数组位置有一个X。有一个Numpy函数来创建这些2D数组:

Y

第5步 - 将其稍微划开

X, Y = np.meshgrid(angle, distance)

把它放在一起

所有步骤按正确顺序排列:

ax.set_xticks(angle)
ax.set_yticks(distance[::2])
ax.set_xlabel('angle')
ax.set_ylabel('distance')