【问题标题】:How to do nested subplots in python如何在python中做嵌套子图
【发布时间】:2018-01-08 18:07:06
【问题描述】:

我有一个这样的数据集:

示例数据框:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

我只知道如何生成单独的情节:

for k, m in zip('ABCD', 'mbry'):
    plt.figure(k)
    for i in range(5):
        plt.subplot(5,1,i+1) 
        plt.bar(range(20), df[k][20*i: 20*(i+1)], color = m)
    plt.subplots_adjust(wspace=0, hspace=0)

plt.show()

如何在同一页面中绘制所有四个图形?

这就是我想要的:


2017 年 8 月 2 日更新:

我也想将它应用于更大的数据集。这是我尝试过的@Phlya 的代码,但它没有给我想要的东西:

更大的数据集:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import gridspec

df = pd.DataFrame(np.random.randint(0,100,size=(100, 11)), columns=list('ABCDEFGHIJK'))

from mpl_toolkits.axes_grid1 import axes_grid

f = plt.figure()
for i, (k, m) in enumerate(zip('ABCDEFGHIJK', 'mbrygrygybr')):
    ag = axes_grid.Grid(f, 261+i, (5, 1), axes_pad=0)
    for j in range(5):
        ag[j].bar(range(20), df[k][20*j: 20*(j+1)], color = m)
        ag[j].set_ylim(0, df.max().max())
        if i%2==0:
            if j == 4:
                ag[j].yaxis.set_ticks([0, ag[j].get_yticks()[-1]])
            else:
                ag[j].yaxis.set_ticks([ag[j].get_yticks()[-1]])
        else:
            ag[j].yaxis.set_ticks([])

        if i in (0, 1):
            ag[j].xaxis.set_ticks([])

plt.subplots_adjust(wspace=0.5, hspace=0.5)
plt.show()

这个数据集有 11 组数据,很明显你可以看到代码出错了:

【问题讨论】:

  • plt.figure 是做什么的?
  • @wwii 抱歉,我在原帖中没有说清楚。我想获得与我的代码相同的图。但我希望它们在同一个页面中。

标签: python pandas matplotlib dataframe


【解决方案1】:

完全重写。

Axesgrid 是你想要的,我想。

from mpl_toolkits.axes_grid1 import axes_grid
nrows = 2
ncols = 6
naxes = 5
f = plt.figure(figsize=(10, 6))
for i, (k, m) in enumerate(zip('ABCDEFGHIJK', 'mbrygrygybr')):
    ag = axes_grid.Grid(f, (nrows, ncols, i+1), (naxes, 1), axes_pad=0)
    for j in range(naxes):
        ag[j].bar(range(20), df[k][20*j: 20*(j+1)], color = m)
        ag[j].set_ylim(0, df.max().max())
        if i%ncols==0:
            if j == naxes-1:
                ag[j].yaxis.set_ticks([0, ag[j].get_yticks()[-1]])
            else:
                ag[j].yaxis.set_ticks([ag[j].get_yticks()[-1]])
        else:
            ag[j].yaxis.set_ticks([])
        if i in range(ncols):
            ag[j].xaxis.set_ticks([])

plt.subplots_adjust(wspace=0.1, hspace=0.1)
plt.show()

已编辑: 漂亮的刻度和间距

已编辑: 现在应该适用于任意数量的网格。 主要问题是在 i>9 时指定网格位置。

【讨论】:

  • @Kevin 很高兴我能帮上忙!另请参阅我的新编辑,以在所有图中制作漂亮的刻度和相同的 y 限制(假设这是您想要的)。
  • 嗨 Phlya,当我尝试在 2 x 6 辅助图上绘制 11 组数据时遇到了一些问题。只显示了十组数据,最后一个面板的位置和形状不对。你能帮我调查一下吗? link。谢谢!
  • 请看新版本!
  • 你还知道如何设置每个axes_grid的标题吗?
  • 也许在网格的顶部坐标轴上添加一个标题?
【解决方案2】:

您可以使用

生成轴
fig, ax = plt.subplots(2, 2)

这将以您想要的方式生成带有 4 个 Axes 对象的单个图形。通过访问二维数组ax 来处理每个Axes 对象。例如,左上图是ax[0][0]

【讨论】:

  • OP 需要 5 个轴,而不是您建议的每个轴。
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多