动态绘制 n 个图

Drawing dynamically n plots

我正在编写测量程序,matplotlib 用于显示获得的测量值。我想出了如何为单个地块做到这一点,即

x=[0,1,2]
y=[3,5,7]
set_xdata(x)
set_ydata(y)

每次 x 和 y 改变时,我调用 set_xdataset_ydata 并刷新图表。

但是,我想根据单个 x 值动态绘制 n y 值,即

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

知道 n(y 图的数量)是否可以做到这一点?

编辑:

我对两件事感兴趣:

  1. 如何在每次数据更改时只刷新多图数据而不是完全重绘图?
  2. matplotlib 是否支持针对单个 X 数据绘图的多个 Y 数据?

简而言之:您必须为每个 "plot" 创建一个 Line2D 实例。 稍微详细一点:

  1. 就像你用单行做的那样,你也可以用多行做同样的事情:

    import matplotlib.pyplot as plt
    
    # initial values
    x = [0,1,2]
    y = [[3,5,7],[4,6,8],[5,7,9]]
    
    # create the line instances and store them in a list
    line_objects = list()
    for yi in y:
        line_objects.extend(plt.plot(x, yi))
    
    # new values with which we want to update the plot
    x = [1,2,3]
    y = [[4,6,8],[5,7,9],[6,8,0]]
    
    # update the y values dynamically (without recreating the plot)        
    for yi, line_object in zip(y, line_objects):
        line_object.set_xdata(x)
        line_object.set_ydata(yi)
    
  2. 不是真的。但是,您可以通过一次调用 plot:

    创建多个 Line2D 对象
    line_objects = plt.plot(x, y[0], x, y[1], x, y[2])
    

    这也是为什么 plot 总是 returns 一个列表。

编辑:

如果您必须经常这样做,使用辅助函数可能会有所帮助:

例如:

def plot_multi_y(x, ys, ax=None, **kwargs):
    if ax is None:
        ax = plt.gca()
    return [ax.plot(x, y, **kwargs)[0] for y in ys]

def update_multi_y(line_objects, x, ys):
    for y, line_object in zip(ys, line_objects):
        line_object.set_xdata(x)
        line_object.set_ydata(y)

那么你可以使用:

# create the lines
line_objects = plot_multi_y(x, y)

#update the lines
update_multi_y(line_objects, x, y)