首页 > 解决方案 > 如何仅从标准化图形坐标制作子图?

问题描述

我已经标准化了图(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 输出

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

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')

面向对象输出

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

谢谢

标签: pythonmatplotlib

解决方案


第一个代码完全有效,这有点巧合。我不会依赖那个。

现在看来您想通过坐标定位轴。在这种情况下,人们宁愿使用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()

推荐阅读