通过调用一个函数来更新图形属性

时间:2018-01-29 12:17:01

标签: python matplotlib

我需要更新已有的数字。但是我希望它完全重绘。我目前有:

import matplotlib.pyplot as plt
def plot_func(xdata, ydata, subplot_kw=None, axis_setters=None):

    fig, ax = plt.subplots(**subplot_kw)
    fig.clf()
    ax.cla()
    fig, ax = plt.subplots(**subplot_kw)

    if axis_setters:
        for setter_name, setter_value in axis_setters.items():
            setter_func = getattr(ax, setter_name)
            setter_func(setter_value)

    plot(xdata, ydata)
    return fig, ax

然后稍后将调用:

plot_func([1,2,3], [1,2,3], subplot_kw={'num': 'name'}, axis_setters={'set_title': 'Title'})

问题是,尴尬:

    fig, ax = plt.subplots(**subplot_kw)
    fig.clf()
    ax.cla()
    fig, ax = plt.subplots(**subplot_kw) 

我需要它,因为我需要调用plot_func任意次数,并且每次我希望它产生正确的绘图。如果我没有第二个:fig, ax = plt.subplots(**subplot_kw) axis_setters条目不起作用。 如果我没有函数的fig.clf()召回覆盖旧图,线条和文字变得模糊。

那么“正确”的做法是什么?

好吧,这似乎是可以理解的:

以下是10次通话后没有前3行的情节: enter image description here

在此之后,在开始时使用奇怪的3行进行10次调用: enter image description here

注意字体是如何变得模糊的,因为每次都会重新绘制字体。每次通话都会变得更糟。它不是压缩神器或任何东西。是的,因为这个数字没有正确重绘。

现在你可能会说:“嘿,然后就是不要更新完整的数字,而只是更新它的数据内容”就像它们here一样。这里的问题是,我不能再改变轴/图形属性了。以此为例axis_setters={'set_title': 'Title'}我在开始时给了。如果我删除了第二个fig, ax = plt.subplots(**subplot_kw)这个setter的调用不再做任何事情。添加fig.canvas.draw()时也会出现同样的情况,但标题仍然无法显示。

编辑: 所以这几乎带给我:

import matplotlib.pyplot as plt
def plot_func(xdata, ydata, figure_kw={}, subplot_args=[111], subplot_kw={}, axis_setters=None):

    fig = plt.figure(**figure_kw)
    ax = fig.add_subplot(*subplot_args, **subplot_kw)
    ax.cla()

    if axis_setters:
        for setter_name, setter_value in axis_setters.items():
            setter_func = getattr(ax, setter_name)
            setter_func(setter_value)

    plot(xdata, ydata)
    return fig, ax

并致电:

for i in range(50):
    plot_func([1,2,3], [1,2,3], figure_kw={'num': 'name'}, axis_setters={'set_title': 'Title'})

有效,现在唯一的“问题”是:subplot_args=[111], subplot_kw={}以任何方式将其合并为一个关键字。现在这只是为了方便起见,因为这就是我通过代码处理几乎所有其他关键字争论的方式,而且它只是很奇怪。

1 个答案:

答案 0 :(得分:0)

这是更新图形的一些正确方法(如果它存在),否则创建一个新图形。请注意,图中的ZoneId.systemDefault()参数应该是一个数字,否则无法检测该图是否已存在。

num