在Matplotlib中,似乎没有一种简单的方法可以在更改图形大小的同时冻结轴(或画布)的大小。可能有一种通过“Transforms”的方法,因为似乎有一个frozen方法,BBoxBase可能让人想起一个MATLAB函数(在MEX上),但是Matplotlib站点上目前没有提供文档。在
一般来说,我建议单独构建体形结构,然后在实际渲染之前调整轴/画布的大小,使其达到新的体形大小。在
例如,在下面,figure_3x1使用选项字典opts中指定的体形尺寸作为6.5×5.5英寸的figure_3x1构建一个带有3x1子图的通用图形:def varargin(pars,**kwargs):
"""
varargin-like option for user-defined parameters in any function/module
Use:
pars = varargin(pars,**kwargs)
Input:
- pars : the dictionary of parameters of the calling function
- **kwargs : a dictionary of user-defined parameters
Output:
- pars : modified dictionary of parameters to be used inside the calling
(parent) function
"""
for key,val in kwargs.iteritems():
if key in pars:
pars[key] = val
return pars
def figure_3x1(**kwargs):
'''
figure_3x1(**kwargs) : Create grid plot for a 1-column complex figure composed of (top-to-bottom):
3 equal plots | custom space
Input:
- left,right,top,bottom
- vs : [val] vertical space between plots
- figsize : (width,height) 2x1 tuple for figure size
Output:
- fig : fig handler
- ax : a list of ax handles (top-to-bottom)
'''
opts = {'left' : 0.1,
'right' : 0.05,
'bottom' : 0.1,
'top' : 0.02,
'vs' : [0.03],
'figsize': (6.5,5.5), # This is the figure size with respect
# to axes will be sized
}
# User-defined parameters
opts = varargin(opts,**kwargs)
nrow = 3
# Axis specification
AxisWidth = 1.0-opts['left']-opts['right']
AxisHeight = [(1.0-opts['bottom']-opts['top']-2*opts['vs'][0])/nrow]
# Axis Grid
# x position
xpos = opts['left']
# y position
ypos = list()
ypos.append(opts['bottom'])
ypos.append(ypos[0]+AxisHeight[0]+opts['vs'][0])
ypos.append(ypos[1]+AxisHeight[0]+opts['vs'][0])
# Axis boxes (bottom-up)
axBoxes = list()
axBoxes.append([xpos,ypos[0],AxisWidth,AxisHeight[0]])
axBoxes.append([xpos,ypos[1],AxisWidth,AxisHeight[0]])
axBoxes.append([xpos,ypos[2],AxisWidth,AxisHeight[0]])
fig = plt.figure(1, figsize=opts['figsize'])
ax = list()
for i in xrange(shape(axBoxes)[0]-1,-1,-1):
ax_aux = fig.add_axes(axBoxes[i])
ax.append(ax_aux)
return fig, ax
现在,我想构建一个类似的图形,保持轴的大小和位置相同(相对于左/下角),但是图形中的空间更大。例如,如果我想在其中一个绘图或多个y轴上添加一个颜色条,然后我需要将多个3x1图形一起显示,以供发布时使用。我们的想法是计算出新图形的实际尺寸,以容纳所有新元素——假设我们需要一个尺寸为7.5x5.5英寸的图形——并根据新图形尺寸调整轴框及其x-y坐标,以便在图形中达到6.5x5.5英寸的原始尺寸。为此,我们在figure_3x1(**kwargs)的opts中引入了一个进一步的选项axref_size,它是一个类型为(width, height)的元组,它描述了相对于我们希望在新的更大图形中构建(和调整大小)轴的图形大小(以英寸为单位)。在这些轴的宽度(AxisWidth)和高度(AxisHeight)相对于较大的图形进行计算后,我们根据left和{}坐标,以及不同轴之间的垂直/水平空间,即hs和vs来调整它们的大小,以获得原始的axref_size图形的大小。在
实际大小调整通过以下方法实现:
^{pr2}$
这样figure_3x1(**kwargs)将被编辑为:def figure_3x1(**kwargs):
'''
figure_3x1(**kwargs) : Create grid plot for a 1-column complex figure composed of (top-to-bottom):
3 equal plots | custom space
Include also the option of specifying axes size according to a reference figure size
'''
opts = {'left' : 0.1,
'right' : 0.05,
'bottom' : 0.1,
'top' : 0.02,
'vs' : [0.03],
'figsize': (6.5,5.5), # This is the figure size with respect
# to axes will be sized
'axref_size': None}
...
...
# Axis specification
AxisWidth = 1.0-opts['left']-opts['right']
AxisHeight = [(1.0-opts['bottom']-opts['top']-2*opts['vs'][0])/nrow]
# Optional resizing
opts, AxisWidth, AxisHeight = freeze_canvas(opts, AxisWidth, AxisHeight)
# Axis Grid
# x position
...
...
return fig, ax
以这种方式figure_3x1(figsize=(7.5,5.5),axref_size=(6.5,5.5))
生成以下较大的图形(即7.5x5.5英寸),但子批次的轴尺寸与上图中的6.5x5.5英寸的尺寸相同。同样,正如另一个回复中指出的,由于图像托管服务缩放了总的图像大小,所以图显示得更小。在