我在图形中具有子图的标准化图形坐标(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
的输出与面向对象的接口不同?如何使其在面向对象的界面中工作?
谢谢
答案 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()