【问题标题】:Joining data points when plotting live data绘制实时数据时连接数据点
【发布时间】:2016-02-15 14:08:38
【问题描述】:

我有一些代码可以从一些温度传感器获取实时数据。该代码每隔 5 秒左右绘制一次从传感器获得的值,并在图表上绘制一个数据点。那里的一切都很好,所以我认为如果将这些点连接起来可能会更好看。我认为这只是在我的plt.plot 末尾添加linestyle = '-' 的情况,但这不会产生连接点的线。

我尝试简化代码以查看我是否遗漏了我在下面显示的内容,但这仍然不能说明问题。

所以我的问题...有没有办法在绘制实时数据时连接点?

x = [1,2,3,4,5,6,7,8,9]
y = [2,5,2,7,9,4,2,7,6]

i= 0

plt.ion()
plt.ylim(0,10)

for i in range (0,9):
    plt.plot(x[i],y[i], marker = 'o', linestyle = '-')
    i+=1
    plt.pause(1)

plt.show(block=True)

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您的for 循环存在一些概念性问题,但这与手头的问题无关。问题是,在您当前的情况下,您的每个 plt.plot 调用都会创建一个包含该数据点的新图。您要做的是创建一个图并更新其数据。

    为了修正你的例子,我会这样做

    plt.ion()
    plt.xlim(0,10)  #  Need to make sure both x and y axes have proper ranges
    plt.ylim(0,10)
    line_plot=plt.plot([],[],marker='o',linestyle='-')[0] # Create an empty plot with which we can work
    
    for xval,yval in zip(x,y):
        line_plot.get_xdata().append(xval) #  Attach a new data point
        line_plot.get_ydata().append(yval)   
        plt.pause(1)
    

    【讨论】:

    • 这适用于我在问题中给出的示例,因此感谢您的回答。但是,如果我不知道号码并且它们不在列表中,那么x = np.random.random()y = np.random.random()*10 这种方法将行不通。有什么办法修改吗?
    • 我已更改解决方案,使其仅附加到折线图中的数据。您现在只需要以任何您想要的方式获取xvalyval。当然,您需要找到一种处理情节边界的方法。
    • 我有点搞不懂xvalyval 是什么?
    • 在您的旧迭代中,它们是 x[i]y[i]。请注意,在 Python 中,for 将遍历任何列表(或事实上的任何可迭代对象),您可以将 zip 视为构造对列表 [(x[0],y[0]),(x[1],y[1]),...]。我用它来表明您也可以使用任何其他方式来创建它们,而不依赖于知道它们的索引号。
    猜你喜欢
    • 2016-11-18
    • 2012-08-17
    • 1970-01-01
    • 2022-07-25
    • 2021-09-07
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多