如何使用CSV文件在线框中绘图 - Numpy / Matplotlib

时间:2018-06-18 17:01:57

标签: python pandas numpy matplotlib

我想在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绘图的原因:

  • X轴:角度
  • Y轴:距离
  • Z轴:信号(对于每对耦合角/距离)

在第一行,我们有索引的名称: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()

但我不知道如何为每个耦合角/距离提取信号并将其放入数据中。

我想知道如何选择数据来创建线框或找到另一种提取数据的方法。

谢谢!

1 个答案:

答案 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()

Wireframe