【问题标题】:Nesting or combining matplotlib figures and plots?嵌套或组合 matplotlib 图形和绘图?
【发布时间】:2020-09-02 11:32:22
【问题描述】:

我有一个函数,它采用任意长度的 3D 日期数据集、价格(浮点数)和一些结果值(浮点数),并制作一组按年份划分的 seaborn 热图。伪代码如下(注意年数因数据集而异,所以我需要它任意缩放):

def makePlots(data):
   split data by year
   fig,axs=plt.subplots(1, numYears)
   x=0
   for year in years
      sns.heatmap(data[year], ax = axs[x++])

   return axs

这会输出一个 matplotlib 图形,其中每一年的热图在一行上彼此相邻,如下例所示:single plotted dataset

现在我有一个更高级别的函数,我在其中输入两个数据集(每个数据集是任意数量的年),并让它打印彼此上方的热图以进行比较。我希望它以某种方式获取由makePlots 方法制作的数字并将它们堆叠在一起,如本例所示:two plotted datasets

def compareData(data1,data2):
   fig1 = makePlots(data1)
   fig2 = makePlots(data2)
   fig, (ax1,ax2) = plt.subplots(2,1)
   ax1 = fig1
   ax2 = fig2
   plt.show()

现在这段代码工作了,但是没有达到预期的效果。它打开 3 个新的绘图窗口,一个带有正确绘制的 data1,一个带有正确绘制的 data2,一个带有空的 2 行子图。有没有办法将 makePlots 图嵌套在一个新的子图中,一个在另一个之上?我也尝试过返回plt.gcf()。关于堆栈溢出的所有其他答案都取决于将轴传递给 plot 方法,但鉴于我每个数据集有任意数量的轴(年)并且最终想要比较任意数量的数据集,这似乎并不理想(不是无论如何,我可以找出一个实现,因为每一行可以有任意数量的年)。

【问题讨论】:

    标签: python matplotlib plot seaborn subplot


    【解决方案1】:

    我不推荐它,但您可以使用fig.add_subplot(nrow, ncol, index) 逐步添加子图。

    所以你的两个函数看起来像这样:

    def compareData(data1, data2):
        fig = plt.figure()
        makePlots(data1, row=0, fig=fig)
        makePlots(data2, row=1, fig=fig)
    
    def makePlots(data, row, fig):
        years = ... # parse data here
        for ii, year in enumerate(years):
            ax = fig.add_subplot(2, len(years), row * len(years) + ii + 1)
            sns.heatmap(data[year], ax=ax)
    

    这有望解决您的问题。


    但是,您只是遇到了这个问题,因为您在同一个函数中混合了数据解析和绘图。我的建议是首先解析数据,然后将新的数据结构传递给一些绘图函数。

    【讨论】:

    • 非常感谢!这完美无缺。但是,如果我遵循您关于分离解析和绘图的建议,您是否建议在分离年份之后,我将每年的每个单独的数据框都放入类似的数据框列表中,然后传递那个单一的大一组数据到绘图函数?
    • @AnishZuté 是的,这就是我建议的工作流程。
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 2011-04-15
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多