【问题标题】:Updating plot in real time实时更新情节
【发布时间】:2022-01-06 16:20:18
【问题描述】:

我通过以下代码将数据提供给矩阵(例如,形状为 100x100):

from random import randint
import matplotlib.pyplot as plt
import numpy as np
import random as rand
tab = np.eye(100, 100)
x = np.arange(0, 100, 1)
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)

for i in range(100):
    for j in range(100):
        tab[i, j] = rand.randint(0, 254)
        line1, = ax.plot(x, tab[i, :], 'r-')
        line1.set_ydata(tab[i, j])
        fig.canvas.draw()
        fig.canvas.flush_events()
    ax.lines.remove(line1)

我需要使用循环更新矩阵并同时升级绘图。 当j 循环结束时,i-loop 想要清除绘图并重新开始绘图。有可能吗?

我的结果:

我需要什么:

【问题讨论】:

  • 我不明白你想在这里做什么。为什么是 100x100 矩阵?为什么 set_ydata 在上一行设置一次之后?如果您尝试实现类似于您发布的示例图片的内容,如果我是对的,它是一堆随机值的线图,那么您不需要 100x100 矩阵,您只需要一个数组。如果那是你想要做的,我可以发布代码作为答案
  • 这是一个简短的代码,显示我拥有什么以及我们需要什么。我正在做一个没有意义的最大项目。我根据传感器的高度创建了一个 2.5D 地图,我想实时显示给定行的给定轴上的整个横截面。如果机器人完成读取给定行,它希望图形清除并重新开始绘制。即 100 个图表

标签: python numpy matplotlib


【解决方案1】:

看完你的评论后,我想我明白你在做什么了

你得到这些水平线的原因是你在绘图后再次设置 ydata(设置为一个常数,所以它就像绘制一条水平线)

考虑下面的代码:

from random import randint
import matplotlib.pyplot as plt
import numpy as np
import random as rand
tab = np.eye(100, 100)
x = np.arange(0, 100, 1)
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)

for i in range(100):
    for j in range(100):
        tab[i, j] = ((50-i/2)*(50-i/2)-(50-j)*(50-j))/100

for i in range(100):
    line1, = ax.plot(x, tab[i, :], 'r-')
    fig.canvas.draw()
    fig.canvas.flush_events()
    ax.lines.remove(line1)

我使用另一个 for 来实例化选项卡映射(因为您使用的是传感器数据,我猜这正是您在代码中所做的,因为您需要读取所有数据(至少是当前的数据)横截面)能够绘制出你想要的图形类型。这相当于在开始时读取所有数据然后开始绘制它)

(为了测试,我还使用了模拟值而不是随机值)

如果你想绘制来自传感器的数据,那么你必须定义一个函数来从传感器获取当前横截面的数据并返回一个数组。 Idk 您用于传感器的库,但我假设扫描功能是同步的,因此该功能将在输入结束后准确返回,使整个事情成为伪实时

from random import randint
import matplotlib.pyplot as plt
import numpy as np
import random as rand
x = np.arange(0, 100, 1)
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)


for i in range(100):
    data = READ_CURRENT_CROSS_SECTION()
    line1, = ax.plot(x, data, 'r-')
    fig.canvas.draw()
    fig.canvas.flush_events()
    ax.lines.remove(line1)

同样,如果将数据绘制为来自传感器的数据是您的目标,那么它将在很大程度上取决于您正在使用的库,但除了所有这些之外,您的代码的问题在于它试图在逐点获取数据时绘图,这为您提供了绘制横截面的数据不足(因此是直线)(PS:实际上有一些方法可以像这样将其拉下来,但会非常慢!)

所以

  1. 编写一个函数来扫描整个 2d 区域并在开始绘图之前返回整个地图(这就像我的第一个代码,我刚才说的函数将替换第 11-13 行)。这会带走实时功能,但它会在短时间内为您提供精美的动画情节

  2. 编写一个函数来扫描每个横截面并将其作为 100 个元素的数组返回。这使得它有点实时,但我想更难实现。这就像我的第二个代码,但你必须自己定义READ_CURRENT_CROSS_SECTION

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2018-07-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多