如何在matplotlib.pyplot中手动定位一个子图?

3

如何重新定位第二行的图表,使其相对于整个图形居中对齐。更一般地说,如何手动在同一行中重新定位图表?

import matplotlib.pyplot as plt
m=0
for i in range(0,2):
    for j in range(0,2):
        if m <= 2:      
            ax = plt.subplot2grid((2,2), (i,j))
            ax.plot(range(0,10),range(0,10))
            m = m+1
plt.show()

感谢您。

enter image description here

2个回答

4
使用GridSpec,您可以创建任意维度的网格,用于子图布局。
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt

gs = gridspec.GridSpec(4, 4)

ax1 = plt.subplot(gs[:2, :2])
ax1.plot(range(0,10), range(0,10))

ax2 = plt.subplot(gs[:2, 2:])
ax2.plot(range(0,10), range(0,10))

ax3 = plt.subplot(gs[2:4, 1:3])
ax3.plot(range(0,10), range(0,10))

plt.show()

这将创建一个4x4网格,每个子图占据2x2的子网格。这样可以正确地居中底部子图。
要使用与您问题中使用的相同的for循环方法,您可以执行以下操作:
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt

gs = gridspec.GridSpec(4, 4)
m = 0

for i in range(0, 4, 2):
  for j in range(0, 4, 2):
    if m < 3:
      ax = plt.subplot(gs[i:i+2, j:j+2])
      ax.plot(range(0, 10), range(0, 10))
      m+=1
    else:
      ax = plt.subplot(gs[i:i+2, 1:3])
      ax.plot(range(0, 10), range(0, 10))

plt.show()

这两个代码片段的结果都是:

Plots


谢谢。但是,如果我要使用for循环来处理i=[0,1]和j=[0,1,2],我该怎么做呢? - undefined
一分钟后,我会用可能的循环逻辑更新我的答案。 - undefined
@gogo的答案已经更新,以符合你的for循环结构。 - undefined
正在用我的测试案例进行测试。 它有效 :) - undefined

1
如果您希望它填充底部,该怎么办?
您可以使用colspan(或rowspan)来占用子图的多个部分。
import matplotlib.pyplot as plt
m=0
for i in range(0,2):
    for j in range(0,2):
        if m <= 2:
            if m == 2:
                ax = plt.subplot2grid((2,2), (i,j), colspan=2)
            else:
                ax = plt.subplot2grid((2,2), (i,j))
            ax.plot(range(0,10),range(0,10))
            m = m+1
plt.show()

请参见http://matplotlib.org/users/gridspec.html


我不想填充空间,只是希望将图形重新定位。有什么想法吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接