动态绘制 n 个图
Drawing dynamically n plots
我正在编写测量程序,matplotlib 用于显示获得的测量值。我想出了如何为单个地块做到这一点,即
x=[0,1,2]
y=[3,5,7]
set_xdata(x)
set_ydata(y)
每次 x 和 y 改变时,我调用 set_xdata
和 set_ydata
并刷新图表。
但是,我想根据单个 x 值动态绘制 n
y 值,即
x=[0,1,2]
y=[[3,5,7],[4,6,8],[5,7,9]]
知道 n
(y 图的数量)是否可以做到这一点?
编辑:
我对两件事感兴趣:
- 如何在每次数据更改时只刷新多图数据而不是完全重绘图?
- matplotlib 是否支持针对单个 X 数据绘图的多个 Y 数据?
简而言之:您必须为每个 "plot" 创建一个 Line2D
实例。
稍微详细一点:
就像你用单行做的那样,你也可以用多行做同样的事情:
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)
不是真的。但是,您可以通过一次调用 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)
我正在编写测量程序,matplotlib 用于显示获得的测量值。我想出了如何为单个地块做到这一点,即
x=[0,1,2]
y=[3,5,7]
set_xdata(x)
set_ydata(y)
每次 x 和 y 改变时,我调用 set_xdata
和 set_ydata
并刷新图表。
但是,我想根据单个 x 值动态绘制 n
y 值,即
x=[0,1,2]
y=[[3,5,7],[4,6,8],[5,7,9]]
知道 n
(y 图的数量)是否可以做到这一点?
编辑:
我对两件事感兴趣:
- 如何在每次数据更改时只刷新多图数据而不是完全重绘图?
- matplotlib 是否支持针对单个 X 数据绘图的多个 Y 数据?
简而言之:您必须为每个 "plot" 创建一个 Line2D
实例。
稍微详细一点:
就像你用单行做的那样,你也可以用多行做同样的事情:
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)
不是真的。但是,您可以通过一次调用
创建多个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)