python - 如何仅从标准化图形坐标制作子图?
问题描述
我已经标准化了图(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()
这会根据我的要求正确生成图形。
但是当我尝试在面向对象的接口中实现相同时,输出是不同的。
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
面向对象接口不同?如何让它在面向对象的接口中工作?
谢谢
解决方案
第一个代码完全有效,这有点巧合。我不会依赖那个。
现在看来您想通过坐标定位轴。在这种情况下,人们宁愿使用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()