gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:16:13 28 4
gpt4 key购买 nike

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

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


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

标签尺寸很容易,因为它们以磅为单位定义。根据内容大小固定图形大小很困难。

这个问题的动机是需要创建多个看起来完全相同的出版物质量图。此外,通过 latex 渲染,字符的大小和形状可以与正文完全相同。这也适用于幻灯片演示。所有这些都归结为必须固定为标准单位的每个字体大小的图形大小。

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

1 分(排版)=

国际单位制352.78×10−6 m 352.778 μm

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

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

最佳答案

你(我)不想要那个。执行此操作的最佳方法是定义以毫米为单位的图形宽度 以毫米为单位的轴宽度并将轴 + 标签居中。高度无关紧要,应该针对空白进行修剪。

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

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

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

关于python - 如何在 matplotlib 中以毫米为单位设置轴尺寸和位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33239243/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com