Python Matplotlib - 将子图添加到子图?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34933905/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Matplotlib - adding subplots to a subplot?
提问by dan_g
I'm trying to create a figure that consists of a 2x2 grid, where in each quadrant there are 2 vertically stacked subplots (i.e. a 2x1 grid). I can't seem to figure out how to achieve this, though.
我正在尝试创建一个由 2x2 网格组成的图形,其中每个象限有 2 个垂直堆叠的子图(即 2x1 网格)。不过,我似乎无法弄清楚如何实现这一目标。
The closest I've gotten is using gridspec and some ugly code (see below), but because gridspec.update(hspace=X)
changes the spacing for all of the subplots I'm still not where I'd like to be.
我得到的最接近的是使用 gridspec 和一些丑陋的代码(见下文),但因为gridspec.update(hspace=X)
改变了所有子图的间距,我仍然不是我想要的地方。
Ideally what I want is to, using the picture below as an example, decrease the spacing between the subplots within each quadrant, while increasing the vertical spacing between the top and bottom quadrants (i.e. between 1-3 and 2-4).
理想情况下,我想要的是,以下图为例,减少每个象限内子图之间的间距,同时增加顶部和底部象限之间的垂直间距(即在 1-3 和 2-4 之间)。
Is there a way to do this (with or without using gridspec)? What I originally envisioned is generating each of the sub-subplot grids (i.e. each 2x1 grid) and inserting them into the larger 2x2 grid of subplots, but I haven't figured out how to add a subplot to a subplot, if there is even a way.
有没有办法做到这一点(使用或不使用 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])
采纳答案by Suever
You can nest your GridSpec using SubplotSpec. The outer grid will be a 2 x 2 and the inner grids will be 2 x 1. The following code should give you the basic idea.
您可以使用 SubplotSpec 嵌套您的 GridSpec。外部网格将是 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()
回答by E. F.
As I had to rely on Suever's answer but had to modify it to my needs, I thought I might contribute in case someone finds it helpful:
由于我不得不依赖 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 channelArangement:
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()