python 在创建和显示matplotlib图之后,是否有任何方法可以更改其中的数据?

jrcvhitl  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(143)

我有一个函数,它打印了一个被调用的图,然后返回一些其他的数据,这个图的代码是

def somefunction(input):

     x = np.linspace(-5,5,100)
     fig, axs = plt.subplots(2,sharex=True)
     fig.suptitle("Some plots")

     axs[0].plot(x, x**2, "-b", label="square")
     axs[1].plot(x, x**3, "-y", label="cube")

     axs[0].set(ylabel="values")
     axs[1].set(xlabel="Timestamp (common)", ylabel="values")

     axs[0].legend()
     axs[1].legend()
 
     plt.show()
     

     return [1,2,3]

现在,我想做的是稍后再次打印这个图,但要包含更多的信息,我考虑过将这里创建的图形保存为函数的输出,我尝试将以下代码添加到代码中:

def somefunction(input):

    x = np.linspace(-5,5,100)
    fig, axs = plt.subplots(2,sharex=True)
    fig.suptitle("Some plots")

    axs[0].plot(x, x**2, "-b", label="square")
    axs[1].plot(x, x**3, "-y", label="cube")

    axs[0].set(ylabel="values")
    axs[1].set(xlabel="Timestamp (common)", ylabel="values")

    axs[0].legend()
    axs[1].legend()

    plt.show()
    fig_out = fig

    return [1,2,3], fig_out

然后我就可以得到函数输出的第二个分量中的数字,然后根据需要修改它。比如:

figure = somefunction(input)[1]
#now perform any wanted changes in the plot and plot again
ax0 = figure.axes[0]
ax0.text(3, 8, 'New text updated in the figure', style='italic',
    bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})

plt.show()

这不起作用,图形确实保存在输出的第二个组件中,但它不允许我更改任何内容,它就在那里,我不能更改它,也不能绘制对图形所做的任何更改。
我也试过保存坐标轴而不是图形,但是同样的情况。我似乎找不到一种方法来编辑这个情节后,它被创建。这甚至可能吗?

yiytaume

yiytaume1#

如果您不尝试同时显示两个图,您的代码是正确的。有多个选项可以解决这个问题,例如:

**选项1:**在末尾显示图

from matplotlib import pyplot as plt

def somefunction(input):
    x = np.linspace(-5,5,100)
    fig, axs = plt.subplots(2,sharex=True)
    fig.suptitle("Some plots")

    axs[0].plot(x, x**2, "-b", label="square")
    axs[1].plot(x, x**3, "-y", label="cube")

    axs[0].set(ylabel="values")
    axs[1].set(xlabel="Timestamp (common)", ylabel="values")

    axs[0].legend()
    axs[1].legend()

    #plt.show() #<- DO NOT USE IT NOW

    return [1,2,3], fig

my_fig = somefunction(input)[1]
ax0 = my_fig.axes[0]
ax0.text(3, 8, 'New text updated in the figure', style='italic', bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})

plt.show()

**选项2:**使用block=False表示等待,直到返回所有图形

def somefunction(input):
    x = np.linspace(-5,5,100)
    fig, axs = plt.subplots(2,sharex=True)
    fig.suptitle("Some plots")

    axs[0].plot(x, x**2, "-b", label="square")
    axs[1].plot(x, x**3, "-y", label="cube")

    axs[0].set(ylabel="values")
    axs[1].set(xlabel="Timestamp (common)", ylabel="values")

    axs[0].legend()
    axs[1].legend()

    plt.show(block=False) #<- USE BLOCK=FALSE

    return [1,2,3], fig

my_fig = somefunction(input)[1]
ax0 = my_fig.axes[0]
ax0.text(3, 8, 'New text updated in the figure', style='italic', bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})

plt.show()

相关问题