Python 如何使用不同的数据更新多个不同的图形

Python 如何使用不同的数据更新多个不同的图形,python,matplotlib,Python,Matplotlib,我认为问这个问题可能很愚蠢,但我在谷歌上找不到任何与我的问题相匹配的解决方案。希望有人能帮忙 简单地说,我想在同一个图上绘制不同的函数,而不是子图,因为我发现大多数在线解决方案都使用子图来实现这一点。我的目的是为了更好地比较,不同的数据线在同一个图形上,相同的绘图,但颜色不同,图例不同。我有两个图形,因为第二个图形只是具有相同想法的其他图形 我尝试了以下代码。但每次循环时,子地块都会被覆盖。我不想把旧台词删掉。我希望每个循环分别更新图1和图2,而不删除以前的数据行 fig1 = plt.

我认为问这个问题可能很愚蠢,但我在谷歌上找不到任何与我的问题相匹配的解决方案。希望有人能帮忙

简单地说,我想在同一个图上绘制不同的函数,而不是子图,因为我发现大多数在线解决方案都使用子图来实现这一点。我的目的是为了更好地比较,不同的数据线在同一个图形上,相同的绘图,但颜色不同,图例不同。我有两个图形,因为第二个图形只是具有相同想法的其他图形

我尝试了以下代码。但每次循环时,子地块都会被覆盖。我不想把旧台词删掉。我希望每个循环分别更新图1和图2,而不删除以前的数据行

    fig1 = plt.figure(1)
    fig2 = plt.figure(2)
    for diffSteps,listpair in fixed_table_plots.items():
        ax1 = fig1.add_subplot(1,1,1)
        ax1.scatter(listpair[0],listpair[1],s=2000,label="error_step_"+str(diffTableSteps))
        ax1.legend()
        plt.show()

        ax2 = fig2.add_subplot(1,1,1)
        accuracy_bw = [x - math.log(y,2) for x,y in zip(listpair[0],listpair[1])]
        ax2.scatter(listpair[0],accuracy_bw,s=200,label="accuracy bw_step_"+str(diffTableSteps))
        ax2.set_xlabel("input int bw")
        ax2.set_ylabel("total bw accuracy")
        ax2.legend()
        plt.show()
非常感谢您的帮助

更新:

    for diffSteps,listpair in fixed_table_plots.items():
        plt.figure(1)
        ax1.scatter(listpair[0],listpair[1],s=2000,label="error_step_"+str(diffTableSteps))
        ax1.legend()

        plt.figure(2)
        accuracy_bw = [x - math.log(y,2) for x,y in zip(listpair[0],listpair[1])]
        ax2.scatter(listpair[0],accuracy_bw,s=200,label="accuracy bw_step_"+str(diffTableSteps))
        ax2.set_xlabel("input int bw")
        ax2.set_ylabel("total bw accuracy")
<>这对我来说效果很好,只是PLT。()不能在中间被调用。有没有办法动态显示绘图?重新激活情节也让人觉得很奇怪。请让我知道这是否是一个好方法


谢谢

这个问题类似于,链接帖子是关于更新一个数字,而你问的是多个数字。我认为您将能够将以下最小示例改编为您的代码:

导入matplotlib.pyplot作为plt
将numpy作为np导入
x=np.linspace(0,2*np.pi)
图1=plt.图()
图2=plt.图()
plt.关闭(图1)
plt.关闭(图2)
对于范围(3)中的i:
plt.图()
fm=plt.get\u current\u fig\u manager()
fm.canvas.figure=fig1
图1.canvas=fm.canvas
plt.plot(x,np.sin(x)+i)
plt.图()
fm=plt.get\u current\u fig\u manager()
fm.canvas.figure=图2
图2.canvas=fm.canvas
plt.plot(x,np.cos(x)+i)
plt.show()
plt.close()

这个问题类似于,但是,链接帖子是关于更新一个数字,而你问的是多个数字。我认为您将能够将以下最小示例改编为您的代码:

导入matplotlib.pyplot作为plt
将numpy作为np导入
x=np.linspace(0,2*np.pi)
图1=plt.图()
图2=plt.图()
plt.关闭(图1)
plt.关闭(图2)
对于范围(3)中的i:
plt.图()
fm=plt.get\u current\u fig\u manager()
fm.canvas.figure=fig1
图1.canvas=fm.canvas
plt.plot(x,np.sin(x)+i)
plt.图()
fm=plt.get\u current\u fig\u manager()
fm.canvas.figure=图2
图2.canvas=fm.canvas
plt.plot(x,np.cos(x)+i)
plt.show()
plt.close()

@finefoot我不知道。我刚试过。我想我犯的一个错误是调用plt.show(),它将清除所有内容。@finefoot我不知道。我刚试过。我想我犯的一个错误是调用plt.show(),它将清除所有内容。这只给出1个数字。我最多可以有n个数字,我需要在我的列表中指定要更新的数字loop@user3431800哦,对不起,是的,当然。所以这个问题是关于更新多个图形的(我已经修改了标题),我添加了另一个关于更新1个图形的问题。我花了一段时间,但我认为另一篇文章中的方法D适用于这里,如果我理解正确的话。更新答案,等待反馈。:)嗨,非常感谢你的回答。如果我正确理解了答案,也从另一篇文章中理解了答案,plt.get_current_fig_manager()和fm.canvas.figure将执行与激活图1和图2相同的操作。这不需要使用plt.figure(id),而是允许我在前面的工作中传递预定义的对象,而不是使用id来做后台工作。请允许我问:使用管理器有什么好处?@user3431800来自文档:“图形管理器是一个容器,用于在屏幕上显示图形的实际后端依赖窗口”-显然,图形本身(包含所有曲线和数据)仍然存在,但在从
plt.show关闭窗口后,为了再次显示图形,必须重新创建其图形管理器。循环中的
plt.figure()
仅用于访问下一个
plt.show
的“新”图形管理器。在再次显示之前,在这里,我们添加了另一个绘图。我想这个例子对你有用吧?这就是您对代码的想法吗?这只给出了1个数字。我最多可以有n个数字,我需要在我的代码中指定要更新的数字loop@user3431800哦,对不起,是的,当然。所以这个问题是关于更新多个图形的(我已经修改了标题),我添加了另一个关于更新1个图形的问题。我花了一段时间,但我认为另一篇文章中的方法D适用于这里,如果我理解正确的话。更新答案,等待反馈。:)嗨,非常感谢你的回答。如果我正确理解了答案,也从另一篇文章中理解了答案,plt.get_current_fig_manager()和fm.canvas.figure将执行与激活图1和图2相同的操作。这不需要使用plt.figure(id),而是允许我在前面的工作中传递预定义的对象,而不是使用id来做后台工作。请允许我问:使用管理器有什么好处?@user3431800来自文档:“图形管理器是一个容器,用于在屏幕上显示图形的实际后端依赖窗口”-显然,图形本身(包含所有曲线和数据)仍然存在,但在从
plt.show关闭窗口后,为了再次显示图形,必须重新创建其图形管理器。循环中的
plt.figure()
仅用于访问下一个
plt.show
的“新”图形管理器。在再次显示之前,在这里,我们添加了另一个绘图。我想这个例子对你有用吧?这就是你对代码的想法吗?