如何在matplotlib中设置以毫米为单位的轴尺寸和位置?

时间:2015-10-20 14:21:01

标签: python matplotlib geometry point figure

我需要一个轴宽80毫米,高60毫米,而标签尺寸为12磅的图形。图形尺寸必须紧密裁剪,边界框外没有空间。我该怎么做呢?

另外,我想要两个堆叠间距为10 mm的轴。我该怎么做?

点是每英寸72点或每毫米72 / 25.4点的标准量度。 边界框是包含图中所有“墨水”的最小框。

标签尺寸很容易,因为它们是以点为单位定义的。根据内容大小确定数字大小很难。

这个问题的动机是需要创建看起来完全相同的多个出版质量图。此外,使用乳胶渲染字符可以与主文本完全相同的大小和形状。这也适用于功率点演示。所有归结为每个字体大小的数字大小必须固定为标准单位。

https://en.wikipedia.org/wiki/Point_(typography)

1分(排版)=

SI单位 352.78×10-6 m352.778μm

美国惯用单位(英制单位)

1.1574×10-3英尺13.889×10-3英寸

1 个答案:

答案 0 :(得分:0)

你(我)不希望如此。最好的方法是以毫米为单位定义图形宽度轴宽度,并以轴为中心+标签。高度是无关紧要的,应该修剪为空白。

这只是一个开始,缺少定心。下一步是清理代码并使其成为一个功能(并在菜单中添加“修剪高度”和“修剪宽度”按钮)。

基本上这将是一个两步过程。在第一步,定义轴的大小,并用标签绘制图形。在步骤2中,调用紧密盒函数,并以英寸计算图形的宽度。然后重新调整图形并确定新的轴位置。

import matplotlib
import pylab

matplotlib.rc('text', usetex=True)
matplotlib.rc('figure', dpi=72)
font = {'family' : 'normal',
        'size'   : 10}
matplotlib.rc('font', **font)
matplotlib.rcParams['text.latex.preamble'] = [
       r'\usepackage{lmodern}'    # latin modern, recommended to replace computer modern sans serif
       r'\usepackage{siunitx}',   # i need upright \micro symbols, but you need...
       r'\sisetup{detect-all}',   # ...this to force siunitx to actually use your fonts
       r'\usepackage{helvet}',    # set the normal font here
       r'\usepackage{sansmath}',  # load up the sansmath so that math -> helvet
       r'\sansmath']  # <- tricky! -- gotta actually tell tex to use! 

matplotlib.rcParams['xtick.major.pad'] = 3 # ticklabel spacing between axis and text
matplotlib.rcParams['ytick.major.pad'] = 2 # 

# APS, PRL, Two Columns
column_width_mm     = 86.4581 #mm
column_height_mm    = 2.5*column_width_mm

fig_hspace_mm       = 10 # mm
fig_wspace_mm       = 10 # mm

axis_width_mm       = 69.16648
axis_height_mm      = 43.09763

column_width_inch   = column_width_mm/25.4
column_height_inch  = column_height_mm/25.4

trim_height_below_mm = 0.0
trim_height_above_mm = 0.0

pylab.figure(num = 1, figsize=(column_width_inch, column_height_inch))

ax_0   = pylab.axes([fig_wspace_mm/column_width_mm, (1.0*fig_hspace_mm + 0.0*axis_height_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_1   = pylab.axes([fig_wspace_mm/column_width_mm, (2.0*fig_hspace_mm + 1.0*axis_height_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_2   = pylab.axes([fig_wspace_mm/column_width_mm, (3.0*fig_hspace_mm + 2.0*axis_height_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_3   = pylab.axes([fig_wspace_mm/column_width_mm, (4.0*fig_hspace_mm + 3.0*axis_height_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])

ax_0.set_position([fig_wspace_mm/column_width_mm, (1.0*fig_hspace_mm + 0.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_1.set_position([fig_wspace_mm/column_width_mm, (2.0*fig_hspace_mm + 1.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_2.set_position([fig_wspace_mm/column_width_mm, (3.0*fig_hspace_mm + 2.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_3.set_position([fig_wspace_mm/column_width_mm, (4.0*fig_hspace_mm + 3.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])

###########################
# plot figure here
###########################
pylab.sca(ax_0)
pylab.xlabel(r'$\mathrm{10pt~Test~Label~with~huge~symbols:}~\int~~\mathrm{[\frac{m}{s}]}$')
###########################

fig = pylab.gcf()

old_size        = fig.get_size_inches()
old_width_mm    = old_size[0]*25.4
old_height_mm   = old_size[1]*25.4 

bbox3 = ax_3.get_tightbbox(pylab.gcf().canvas.get_renderer())
bbox0 = ax_0.get_tightbbox(pylab.gcf().canvas.get_renderer())

trim_height_below_mm = ((bbox0.ymin)/72.0*25.4)
trim_height_above_mm = old_height_mm - ((bbox3.ymax+4)/72.0*25.4)

new_size        = fig.get_size_inches()
new_width_mm    = new_size[0]*25.4 
new_height_mm   = new_size[1]*25.4 - trim_height_below_mm - trim_height_above_mm

fig.set_size_inches(new_width_mm/25.4, new_height_mm/25.4, num = 1, forward=True)

print new_size, old_size, new_width_mm, new_height_mm
print trim_height_below_mm, trim_height_above_mm

column_width_mm     = new_width_mm
column_height_mm    = new_height_mm 

ax_0.set_position([fig_wspace_mm/column_width_mm, (1.0*fig_hspace_mm + 0.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_1.set_position([fig_wspace_mm/column_width_mm, (2.0*fig_hspace_mm + 1.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_2.set_position([fig_wspace_mm/column_width_mm, (3.0*fig_hspace_mm + 2.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])
ax_3.set_position([fig_wspace_mm/column_width_mm, (4.0*fig_hspace_mm + 3.0*axis_height_mm - trim_height_below_mm)/column_height_mm, axis_width_mm/column_width_mm, axis_height_mm/column_height_mm])

pylab.show()