如何仅从规范化的图形坐标制作子图?

时间:2019-08-01 17:59:56

标签: python matplotlib

我在图形中具有子图的标准化图形坐标(left, bottom, right, top)。这些坐标是由其他软件生成的。子图的数量不固定。我正在尝试使用这些坐标生成图形。

这是我尝试过的一个小例子。

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig = plt.figure()
rects=[[0, 0.5, 0.75, 1],[0.25, 0, 1, 0.5]]
for i in range(2):
    gs = gridspec.GridSpec(1, 1)
    ax = fig.add_subplot(gs[0])
    ax.plot([1, 2, i])
    ax.set_xlabel(i)
    gs.tight_layout(fig, rect=rects[i])
plt.show()

这将根据我的要求正确生成图形。

Pyplot Output

但是当我尝试在面向对象的接口中实现相同的输出时,

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.gridspec as gridspec

fig = Figure()
canvas=FigureCanvas(fig)
rects=[[0, 0.5, 0.75, 1],[0.25, 0, 1, 0.5]]
for i in range(2):
    gs = gridspec.GridSpec(1, 1)
    ax = fig.add_subplot(gs[0])
    ax.plot([1, 2, i])
    ax.set_xlabel(i)
    gs.tight_layout(fig, rect=rects[i])
fig.savefig('test')

OO Output

我的方法正确吗?为什么pyplot的输出与面向对象的接口不同?如何使其在面向对象的界面中工作?

谢谢

1 个答案:

答案 0 :(得分:0)

巧合的是,第一个代码完全起作用。我不会依靠那个。

现在看来您想按坐标定位轴。在那种情况下,宁愿使用add_axes,然后从矩形中计算出延伸量,

import matplotlib.pyplot as plt

fig = plt.figure()
rects=[[0, 0.5, 0.75, 1],[0.25, 0, 1, 0.5]]
for i, rect in enumerate(rects):
    a,b,c,d = rect
    ext = [a,b,c-a,d-b]
    ax = fig.add_axes(ext)
    ax.plot([1, 2, i])
    ax.set_xlabel(i)

plt.show()

由于使用的坐标,所得图形可能没有太大意义。也许,这些不是您要使用的?


也可以使用单个gridspec来生成与问题中相似的图形,例如

import matplotlib.pyplot as plt

fig = plt.figure()
gs = fig.add_gridspec(2,3) 

ax1 = fig.add_subplot(gs[0,:2])
ax2 = fig.add_subplot(gs[1,1:])

for i, ax in enumerate([ax1, ax2]):
    ax.plot([1, 2, i])
    ax.set_xlabel(i)

fig.tight_layout()
plt.show()