我想在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文件,以便在最后看到相同的结果!
如果你能帮助我,我将不胜感激!
谢谢!
答案 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()
显示器
答案 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,您的问题可分为几个步骤:
我已将您的数据存储在名为data.txt
的文件中。
我不太了解Pandas,但这也可以通过名为loadtxt
的Numpy的简单函数来处理。由于第一列和第一行中的文本“距离”值,您的数据有点问题。但是不要惊慌我们将文件加载为字符串矩阵:
raw_data = np.loadtxt('data.txt', delimiter=';', dtype=np.string_)
要从原始数据中提取所需数据,我们可以执行以下操作:
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]))
matplotlib.org的示例看起来很简单:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z)
plt.show()
但诀窍是让X, Y, Z
参数正确...
X
和Y
数据 Z
数据只是我们的data
值:
Z = data
X
和Y
也应该是2D数组,以便plot_wireframe
可以找到2D数组中Z
的每个值的x和y {{1}在同一个数组位置有一个X
。有一个Numpy函数来创建这些2D数组:
Y
X, Y = np.meshgrid(angle, distance)
所有步骤按正确顺序排列:
ax.set_xticks(angle)
ax.set_yticks(distance[::2])
ax.set_xlabel('angle')
ax.set_ylabel('distance')