这个问题是制作海报:如何使用毫米和左上角原点将艺术家放置在图中的后续问题
此代码:
import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D
mm, dpi = 1/25.4, dpi
w, h = 841, 1189
trans = Affine2D().scale(mm*dpi).scale(1,-1).translate(0,h*mm*dpi)
fig = plt.figure(figsize=(w*mm, h*mm), layout='none', dpi=dpi)
fig.patches.append(
plt.Rectangle((230, 190), 40, 18, transform=trans))
fig.savefig('A0.pdf')
fig.savefig('A0.png')
生成空 PDF,而 PNG 文件是正确的。
不幸的是,拥有宽幅喷墨绘图仪的印刷店需要 PDF。虽然我可以将光栅文件转换为 PDF,但我更喜欢直接生成正确的 PDF。
我的代码中是否有问题,或者它不应该发生,并且这是一个我必须向 Matplotlib 开发人员报告的错误?
此代码不使用自定义转换,会生成正确的 PDF,其中矩形位于正确的位置和正确的尺寸。
import numpy as np
import matplotlib.pyplot as plt
mm, dpi = 1/25.4, 96
w, h = 841, 1189
fig = plt.figure(dpi=dpi, layout='none', figsize=(w*mm,h*mm))
fig.patches.append(plt.Rectangle((660/w, 1-1000/h), 40/w, -40/h,
transform=fig.transFigure))
fig.savefig('A0.pdf')
更新
...
fig = plt.figure(figsize=(w*mm, h*mm), layout='none', dpi=dpi)
fig.patches.append(
plt.Rectangle((230, 190), 40, 18, transform=trans))
fig.patches.append(
plt.Rectangle((600/w, 1-190/h), 40/w, -18/h, transform=fig.transFigure))
fig.savefig('A0.pdf')
生成一个非空 PDF,但只有第二个矩形(未使用自定义转换绘制)可见。
在 2010 年 7 月的 this 回溯线程中,他们建议将
dpi=72
硬编码到 PDF 渲染器中,以便向后兼容较旧的 PDF 规范。事实上,当我将其设置为 savefig
时,矩形(以及使用自定义变换添加到图形中的任何其他艺术家)渲染得很好:
fig.savefig("A0.pdf", dpi=72)