【问题标题】:Python Refreshing Pyplot Line from a Changing Length ArrayPython从变化的长度数组中刷新Pyplot线
【发布时间】:2018-08-27 08:38:03
【问题描述】:

我确定有人问过这个问题,但我很难找到适用于搜索的简明答案。一些好的答案似乎取决于提前计算数组的最终大小。看起来这应该很简单,而且我有点新手所以也许我只是在搜索错误的术语......

我的问题是: 当数组的长度未知且随时间变化时,如何让 PyPlot 刷新源自 numpy 数据数组的现有行的数据?

我目前的代码如下

#Initial Setup    
changing_dataset = np.array(1) #initialize with a single blank y-value   
plt.close('all') #clear all the priors   
plt.ion()
f, axarr = plt.subplots(3,2) #setup a 3x2 plot ...only 1 shown below
axarr[0,0].set_title('My Plot')
line1, = axarr[0,0].plot(changing_dataset)
plt.show

... some code which appends new data to changing_dataset is omitted here...

那么我只想这样做:

line1.set_ydata(changing_dataset)
f.canvas.draw() 
f.canvas.flush_events()
plt.show()

为了更新我初始绘图中的线,现在基于数组“changeing_dataset”中包含的新的、更大的数据集。

但这会产生类似的错误

ValueError:形状不匹配:无法将对象广播到单个形状

如何绕过似乎需要数组为静态大小的要求?我宁愿不需要重新命名并从头开始构建绘图 - 因为唯一需要更改的是线条(并且可能会自动重新缩放轴)

【问题讨论】:

    标签: python arrays matplotlib graph line


    【解决方案1】:

    绘图必然由 x 和 y 值组成。当设置 line1.set_ydata(new_y_data) 时,new_y_data 的长度与原始 y 数据不同,您会破坏 x 和 y 值的对应关系,从而导致问题中观察到形状不匹配错误。

    如果要更改图中 y 值的数量,还需要更改 x 值的数量。

    任意使用

    line.set_xdata(new_x_values)
    line.set_ydata(new_y_values)
    

    或在一排

    line.set_data(new_x_values, new_y_values)
    

    如果您根据索引绘制 y 值,new_x_values 将只是前 n 个整数,其中 n 是 y 值的数量,

    line.set_data(np.arange(len(new_y_values)), new_y_values)
    

    【讨论】:

    • 这是有道理的,有趣的是,输入 x 值并不是最初的要求,因为正如您所建议的,我只打算使用 X 的索引。但是,当我运行绘图时,虽然它不再给出错误,在我的 line.set_data() 循环部分中,它似乎没有按预期刷新图表......它只会在我返回到 line1 的原始初始化语句时生成数据,= axarr [ 1,0].plot(np.arange(len(new_y_values)), new_y_values)
    • 不确定我是否理解问题所在。使用答案中的命令,将线的数据替换为新的值,从而更新折线图。
    • 我想我明白了 - 缺少的部分只是我的轴需要重置,因为初始值基本上为零,但随着数据集的变化,我们需要使用循环重新调整relims 和 autoscales ... code axarr[a,b].relim() axarr[a,b].autoscale_view() code
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2014-07-27
    • 2013-06-24
    相关资源
    最近更新 更多