嵌套或组合matplotlib图形和绘图?

2024-10-04 05:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,可以获取任意长度的3D数据集,包括日期、价格(float)和一些结果值(float),并生成一组按年份分割的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个新的绘图窗口,一个窗口的数据1打印正确,一个窗口的数据2打印正确,还有一个窗口的2行子绘图为空。有没有办法将makeplot嵌套在一个新的子地块上?我还尝试返回plt.gcf()。关于堆栈溢出的所有其他答案都取决于将轴传递给plot方法,但考虑到每个数据集有任意数量的轴(年),并且最终希望比较任意数量的数据集,这似乎并不理想(无论如何,我都无法找到这一点的实现,因为每一行可以有任意的年数)


Tags: 数据函数代码datadeffigpltfloat
1条回答
网友
1楼 · 发布于 2024-10-04 05:26:24

我不建议这样做,但您可以使用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)

希望这能解决你的问题


但是,之所以会出现此问题,是因为您在同一个函数中混合了数据解析和绘图。我的建议是首先解析数据,然后将新的数据结构传递到一些绘图函数中

相关问题 更多 >