【问题标题】:Overlaying matplotlib plot from multiple function calls while also plotting them separately从多个函数调用中叠加 matplotlib 图,同时分别绘制它们
【发布时间】:2019-08-09 09:53:54
【问题描述】:

我有一个函数,它使用 seaborn 的 distplot 绘制和显示分布。看起来像这样

def getPlot(data):
    x=sns.distplot(data, hist=False)
    plt.show()
    return x

每次调用该函数时,我都会得到分布图。

我需要一些帮助来修改函数,以便在多次调用函数结束时我应该得到一个额外的图,它是所有先前图的组合。

如果我的函数调用是

getPlot(data1)
getPlot(data2)
getPlot(data3)

我应该在调用函数时获取数据的各个图,并且在最后我希望将 3 个数据的图相互叠加。

仅将 plt.show() 移到函数外是不够的,因为我想要单独数据的单独图以及包含所有数据的图。

【问题讨论】:

  • “最后”是什么意思?每次来电getPlot都不知道会不会再来电。
  • @Goyo 我只想积累剧情。我可以在最后打电话给plt.show() 来获得最终的情节。
  • 您已经在getPlot 中调用了plt.show() 并关闭了这些数字,因此额外的调用不会显示任何内容。也许您可以编写一个新函数(我们称之为getAllPlots),它采用数据集列表(或iterble)并绘制它们的叠加分布,然后在最后调用getAllPlots([data1, data2, data3])。这行得通吗?
  • @AndrasDeak 如果我不在函数内调用plt.show(),那么我将丢失每个data 的单独图,最后在最后单独获得所有图的组合.但我想要他们两个,组合以及个人数据。
  • 哦,好吧,我完全错过了。这有点困难。您仍然需要在最后致电plt.show(),但您需要单独的数字。最简单的解决方案是在调用任何函数之前先创建一个单独的图形和坐标轴,并将该坐标轴传递给每个函数,该函数既将数据绘制到该坐标轴中,也将绘制到一个全新的图形中。我会投票重新提出这个问题,因为那样它就不是重复的了。

标签: python matplotlib seaborn


【解决方案1】:

由于您必须同时保留一个单独的图 一个联合的数据,因此您必须将每个数据集绘制两次。一次在一个单独的轴上,一次在一个共同的轴上。

我要做的是创建一个图形和一个轴,将所有内容绘制在一起。然后将该轴对象传递给函数,并将函数绘制到轴以及新图形中:

def plot_twice(data, ax_all):
    # first plot into the common axes
    sns.distplot(data, hist=False, ax=ax_all)

    # and create a new figure and axes for a standalone plot
    fig,ax = plt.subplots()
    x = sns.distplot(data, hist=False, ax=ax)
    return x

# create axes for the common plot
fig,ax_all = plt.subplots()

# now plot the things
getPlot(data1, ax_all)
getPlot(data2, ax_all)
getPlot(data3, ax_all)

# only call blocking plt.show() at the end
plt.show()

使用 matplotlib 将绘图从一个轴复制 到另一个轴似乎并不可行(参见例如 thisthis),因此除非绘图花费过多时间或为简单起见,我将数据绘制两次。

【讨论】:

猜你喜欢
  • 2011-03-14
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2014-04-12
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多