Matplotlib - 将子图添加到子图?
Matplotlib - adding subplots to a subplot?
我正在尝试创建一个由 2x2 网格组成的图形,其中每个象限中有 2 个垂直堆叠的子图(即 2x1 网格)。不过,我似乎无法弄清楚如何实现这一目标。
我得到的最接近的是使用 gridspec 和一些丑陋的代码(见下文),但是因为 gridspec.update(hspace=X)
改变了所有子图的间距我仍然不是我想去的地方.
理想情况下,我想要的是,以下图为例,减少每个象限内子图之间的间距,同时增加顶部和底部象限之间的垂直间距(即 1-3 和 2- 4).
有没有办法做到这一点(使用或不使用 gridspec)?我最初设想的是生成每个子图网格(即每个 2x1 网格)并将它们插入更大的 2x2 子图网格中,但我还没有想出如何将子图添加到子图,如果有的话离开。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(4,2)
gs.update(hspace=0.4)
for i in range(2):
for j in range(4):
ax = plt.subplot(gs[j,i])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tick_params(which='both', top='off', right='off')
if j % 2 == 0:
ax.set_title(str(i+j+1))
ax.plot([1,2,3], [1,2,3])
ax.spines['bottom'].set_visible(False)
ax.get_xaxis().set_visible(False)
else:
ax.plot([1,2,3], [3,2,1])
你可以nest your GridSpec using SubplotSpec。外部网格将是 2 x 2,内部网格将是 2 x 1。下面的代码应该可以让您了解基本概念。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(10, 8))
outer = gridspec.GridSpec(2, 2, wspace=0.2, hspace=0.2)
for i in range(4):
inner = gridspec.GridSpecFromSubplotSpec(2, 1,
subplot_spec=outer[i], wspace=0.1, hspace=0.1)
for j in range(2):
ax = plt.Subplot(fig, inner[j])
t = ax.text(0.5,0.5, 'outer=%d, inner=%d' % (i, j))
t.set_ha('center')
ax.set_xticks([])
ax.set_yticks([])
fig.add_subplot(ax)
fig.show()
由于我不得不依赖 Suever 的回答,但又不得不根据我的需要对其进行修改,所以我想我可能会做出贡献,以防有人发现它有帮助:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
channelArrangement = [16, 17, 18 , 19 , 22, 25, 28 , 29 , 31]
fig = plt.figure(figsize=(10, 8))
outer = gridspec.GridSpec(1, 2, wspace=0.2, hspace=0.2)
for i in range(2):
inner = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=outer[i],
wspace=0.1, hspace=0.1)
row = 0
col = 0
maxCol = 3
for chan in channelArrangement:
ax = plt.Subplot(fig, inner[row,col])
t= ax.text(0.5,0.5, 'outer=%d\nrow=%d\ncol=%d' % (i,row,col))
ax.set_xticks([])
ax.set_yticks([])
t.set_ha('center')
fig.add_subplot(ax)
col += 1
if col == maxCol:
col = 0
row += 1
plt.show()
您现在可以使用 figure.subfigure
嵌套子图:https://matplotlib.org/stable/gallery/subplots_axes_and_figures/subfigures.html
您可能还会发现 subplot_mosaic
很有用,因为它支持嵌套:
https://matplotlib.org/stable/tutorials/provisional/mosaic.html
虽然嵌套总是有点痛苦,但可以说这两种方法都使过程更容易、更灵活。
取自上面的例子:
import matplotlib.pyplot as plt
fig = plt.figure(constrained_layout=True)
subfigs = fig.subfigures(2, 2)
for outerind, subfig in enumerate(subfigs.flat):
subfig.suptitle(f'Subfig {outerind}')
axs = subfig.subplots(2, 1)
for innerind, ax in enumerate(axs.flat):
ax.set_title(f'outer={outerind}, inner={innerind}', fontsize='small')
ax.set_xticks([])
ax.set_yticks([])
plt.show()
将子图添加到子图中的简单方法是将图形分成子图,然后向它们添加子图。
import matplotlib.pyplot as plt
fig = plt.figure(constrained_layout=True,figsize=(10,10))
subplots = fig.subfigures(2,2)
ax0 = subplots[0][0].subplots(2,1)
ax1 = subplots[0][1].subplots(2,1)
ax2 = subplots[1][0].subplots(2,1)
ax3 = subplots[1][1].subplots(2,1)
plt.show()
可以参考这个Matplotlib官方文档here
希望对您有所帮助。
我正在尝试创建一个由 2x2 网格组成的图形,其中每个象限中有 2 个垂直堆叠的子图(即 2x1 网格)。不过,我似乎无法弄清楚如何实现这一目标。
我得到的最接近的是使用 gridspec 和一些丑陋的代码(见下文),但是因为 gridspec.update(hspace=X)
改变了所有子图的间距我仍然不是我想去的地方.
理想情况下,我想要的是,以下图为例,减少每个象限内子图之间的间距,同时增加顶部和底部象限之间的垂直间距(即 1-3 和 2- 4).
有没有办法做到这一点(使用或不使用 gridspec)?我最初设想的是生成每个子图网格(即每个 2x1 网格)并将它们插入更大的 2x2 子图网格中,但我还没有想出如何将子图添加到子图,如果有的话离开。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(4,2)
gs.update(hspace=0.4)
for i in range(2):
for j in range(4):
ax = plt.subplot(gs[j,i])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tick_params(which='both', top='off', right='off')
if j % 2 == 0:
ax.set_title(str(i+j+1))
ax.plot([1,2,3], [1,2,3])
ax.spines['bottom'].set_visible(False)
ax.get_xaxis().set_visible(False)
else:
ax.plot([1,2,3], [3,2,1])
你可以nest your GridSpec using SubplotSpec。外部网格将是 2 x 2,内部网格将是 2 x 1。下面的代码应该可以让您了解基本概念。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(10, 8))
outer = gridspec.GridSpec(2, 2, wspace=0.2, hspace=0.2)
for i in range(4):
inner = gridspec.GridSpecFromSubplotSpec(2, 1,
subplot_spec=outer[i], wspace=0.1, hspace=0.1)
for j in range(2):
ax = plt.Subplot(fig, inner[j])
t = ax.text(0.5,0.5, 'outer=%d, inner=%d' % (i, j))
t.set_ha('center')
ax.set_xticks([])
ax.set_yticks([])
fig.add_subplot(ax)
fig.show()
由于我不得不依赖 Suever 的回答,但又不得不根据我的需要对其进行修改,所以我想我可能会做出贡献,以防有人发现它有帮助:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
channelArrangement = [16, 17, 18 , 19 , 22, 25, 28 , 29 , 31]
fig = plt.figure(figsize=(10, 8))
outer = gridspec.GridSpec(1, 2, wspace=0.2, hspace=0.2)
for i in range(2):
inner = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=outer[i],
wspace=0.1, hspace=0.1)
row = 0
col = 0
maxCol = 3
for chan in channelArrangement:
ax = plt.Subplot(fig, inner[row,col])
t= ax.text(0.5,0.5, 'outer=%d\nrow=%d\ncol=%d' % (i,row,col))
ax.set_xticks([])
ax.set_yticks([])
t.set_ha('center')
fig.add_subplot(ax)
col += 1
if col == maxCol:
col = 0
row += 1
plt.show()
您现在可以使用 figure.subfigure
嵌套子图:https://matplotlib.org/stable/gallery/subplots_axes_and_figures/subfigures.html
您可能还会发现 subplot_mosaic
很有用,因为它支持嵌套:
https://matplotlib.org/stable/tutorials/provisional/mosaic.html
虽然嵌套总是有点痛苦,但可以说这两种方法都使过程更容易、更灵活。
取自上面的例子:
import matplotlib.pyplot as plt
fig = plt.figure(constrained_layout=True)
subfigs = fig.subfigures(2, 2)
for outerind, subfig in enumerate(subfigs.flat):
subfig.suptitle(f'Subfig {outerind}')
axs = subfig.subplots(2, 1)
for innerind, ax in enumerate(axs.flat):
ax.set_title(f'outer={outerind}, inner={innerind}', fontsize='small')
ax.set_xticks([])
ax.set_yticks([])
plt.show()
将子图添加到子图中的简单方法是将图形分成子图,然后向它们添加子图。
import matplotlib.pyplot as plt
fig = plt.figure(constrained_layout=True,figsize=(10,10))
subplots = fig.subfigures(2,2)
ax0 = subplots[0][0].subplots(2,1)
ax1 = subplots[0][1].subplots(2,1)
ax2 = subplots[1][0].subplots(2,1)
ax3 = subplots[1][1].subplots(2,1)
plt.show()
可以参考这个Matplotlib官方文档here
希望对您有所帮助。