有没有方便的方法来重绘实时数据的绘图图(matlibplot,python2.7)?

时间:2019-02-06 14:05:53

标签: python matplotlib data-science ros

我从麦克风收到一堆实时数据。 数据集的长度为4000,每秒接收5次。

我使用python2.7和matplotlib。要了解数据集的概念:

如果安静

[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -2, 0, -1, 0, 0, 0, -1, 1, -2, 0, -2, -2, -8, -1, -1, 0, -2, -1, -2, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1,-1, 0, -1, -4, -1, 0, -1, 2, -1, 0, 2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, ...]

如果声音很大:

[-372, -37, -157, -143, 93, -212, 304, -225, 432, -177, 450, -79, 351, 40, 159, 147, -77, 213, -296, 222, -440, 173, -467, 77, -366, -41, -161, -147, 90, -215, 308, -225, 435, -175, 446, -77, 351, 42, 167, 147, -70, 210, -296,  -166, 456, -76, 374, 34, ...]

我的python脚本:

def plot_data(data):
    x = [i for i in range(0, 4000)]
    plt.plot(x,data.data)
    plt.show()

def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber('/miro/rob01/platform/mics', platform_mics, show_data)
    rospy.spin()

if __name__ == '__main__':
    listener()

我想绘制数据并在每次获得新的数据对象时重新绘制或更新。需要不断更新图表。

图形应如下所示: enter image description here

您知道这样做的好方法吗?

1 个答案:

答案 0 :(得分:0)

可能有用的一件事是matplotlib提供的animation功能。它们有多个examples。我认为this example似乎是一个简单的起点。从本质上讲,您无需更新每次,而是更新Line2D对象的数据。不过,我尚未尝试使用ROS回调进行此操作,因此无法说出它在您的用例中的效果如何。

如果您已经在使用ROS,我真的建议您使用rqt_plot。它专为您想要的内容而设计,可以实时绘制主题中的数据,您可以将matplotlib用作绘制后端(尽管我认为默认情况下它们使用pyqtgraph具有一定的速度优势)。甚至不必为编写代码而已,它只是一个命令行调用

rqt_plot

,将弹出一个GUI,可让您指定要显示的主题。

作为最后的建议,如果您要绘制多个主题,我发现Plot Juggler是更好的选择,它还有一个优点是可以在ROS之外使用它并可视化从文件静态加载数据。