我想在3D中用Pandas / MatplotLib / Numpy作为线框进行绘图
我正在使用RFID传感器,我正在尝试记录我在不同距离+不同角度接收的信号。我希望看到距离上升与角度之间的相关性。
我已经有一个完整的CSV文件,如下所示:
Distance;0 ;23 ;45 ;90
0 ;-33.24 ;-36.72;-39.335;-35.21
5 ;-31.73 ;-35.26;-41.56 ;-27.41
15 ;-31.175;-36.91;-40.74 ;-44.615
25 ;-35.305;-51.13;-45.515;-50.485
40 ;-35.205;-49.27;-55.565;-53.64
60 ;-41.8 ;-62.19;-58.14 ;-54.685
80 ;-47.79 ;-64.24;-58.285;-56.08
100 ;-48.43 ;-63.37;-64.595;-60.0
120 ;-49.07 ;-66.07;-63.475;-76.0
140 ;-50.405;-61.43;-62.635;-76.5
160 ;-52.805;-69.25;-71.0 ;-77.0
180 ;-59.697;-66.45;-70.1 ;nan
200 ;-56.515;-68.60;-73.4 ;nan
这就是我想用3D绘图的原因:
在第一行,我们有索引的名称:Distance
和不同的角度:0°,23°,45°,90°
在第一列,我们有不同的距离代表Y轴。
内部的矩阵表示信号,因此,Z轴的值......
我用Numpy加载了我的rawdata:
raw_data = np.loadtxt('data/finalData.csv', delimiter=';', dtype=np.string_)
然后我使用matplotlib生成我的线框:
angle = raw_data[0 , 1:].astype(float)
distance = raw_data[1:, 0 ].astype(float)
data = ????
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
Z = data
X, Y = np.meshgrid(angle, distance)
ax.plot_wireframe(X, Y, Z)
ax.set_xticks(angle)
ax.set_yticks(distance[::2])
ax.set_xlabel('angle')
ax.set_ylabel('distance')
plt.title('RSSI/angle/distance in wireframe')
plt.savefig('data/3d/3d.png')
plt.show()
但我不知道如何为每个耦合角/距离提取信号并将其放入数据中。
我想知道如何选择数据来创建线框或找到另一种提取数据的方法。
谢谢!
答案 0 :(得分:1)
我用pandas读取数据,然后抓住numpy数组。注意使用.values。
import pandas as pd
import matplotlib.pylab as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d
df= pd.read_csv('test.txt', sep=';')
df.index = df.Distance
del df['Distance']
raw_data = df
angle = raw_data.columns.values.astype(float)
distance = raw_data.index.values.astype(float)
data = raw_data.values
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
Z = data
X, Y = np.meshgrid(angle, distance)
ax.plot_wireframe(X, Y, Z)
ax.set_xticks(angle)
ax.set_yticks(distance[::2])
ax.set_xlabel('angle')
ax.set_ylabel('distance')
plt.title('RSSI/angle/distance in wireframe')
plt.savefig('data/3d/3d.png')
plt.show()