【问题标题】:matplotlib linewidth when saving a PDF保存 PDF 时的 matplotlib 线宽
【发布时间】:2013-04-12 04:26:29
【问题描述】:

我有一个对线宽很敏感的具有一些相当精细的特征的图形。我想将此图保存为可以轻松打印的 PDF(即在接收器侧没有缩放,只需 Command+P 即可)。不幸的是,当我设置 figsize=(8.5,11) 以正确调整 PDF 的大小以进行打印时,matplotlib 选择了一个非常粗的默认线宽和文本大小,这会弄乱绘图(图例太大并且条形图中的线条重叠)。如果我设置 figsize=(17,22) 在将 PDF 缩放到 50% 进行打印后,我会得到一个非常可行的默认线宽和文本大小。这是我一直在使用的,但是由于政治原因,该解决方案已变得不可行,我真的不想每次进行更改时都在 Illustrator 中缩放 PDF。

如果我可以使用位图,我可以通过设置 figsize=(17,22) 并将 dpi 设置为目标 dpi 的一半来获得所需的结果,但这不适用于 PDF,因为 dpi 参数似乎被忽略了。我想要一个PDF

  • 看起来像 box_good.png(带有细线、小文本的大小错位图)
  • 尺寸为 8.5x11 英寸(或类似打印)
  • 可以在 Illustrator 中编辑(不是包装在 pdf 中的位图)

我不禁怀疑在另存为 PDF 时有一种简单的方法可以实现“双倍大小,一半 dpi”的技巧,但我放弃了让它发挥作用,并开始尝试直接操作线宽和文本大小。我成功修改了文本大小但没有修改线宽。这是我尝试过的事情的记录:

# Tried:
# fig.set_size_inches(17,22)
# fig.savefig('boxes.pdf', dpi=100,150,300)
#   dpi parameter has no effect on linewidth, text size, or the PDF's dimensions
# 'markerscale=.5' on plt.legend and pax.legend
#   no effect
# mp.rcParams['font.size']=8
#   worked! made text smaller, now for linewidth...
# mp.rcParams['lines.linewidth']=5
#   no effect
# fig.set_linewidth(5)
#   no effect
# pax.axhline(linewidth=5)
#   only changes x axis not box surrounding subplot
# fig.set_size_inches(8.5,11) immediately before plt.savefig('boxes.pdf')
#   identical results to calling plt.figure(figsize=(8.5,11)) in the first place

# I tried passing plt.figure(figsize=(17,22)) and swapping it to 8.5x11 using
# fig.set_size_inches right before saving, but the lines were thick and the text
# was large in the PDF, exactly as if I had set figsize=(8.5,11) to begin with

这是源文件(我已将情节简化为基本内容,因此明显的样式变通办法可能不是可行的解决方案)

import numpy as np
import matplotlib as mp
import matplotlib.pyplot as plt

x = np.arange(200)
bottom_red_bar = -np.random.random(200)
bottom_black_bar = np.random.random(200) * bottom_red_bar

fig = plt.figure()
for subplotnum in [1,2,3]:
    pax = plt.subplot(310+subplotnum)
    pax.set_ylim([-1,1])
    bot_rb = pax.bar(x,         bottom_red_bar,1,color='r')
    bot_bb = pax.bar(x+(1-.3)/2,bottom_black_bar,.3,color='k')
    pax.legend([bot_rb,bot_bb],['Filler Text 1','Filler Text 2'],loc=4)

fig.set_size_inches(8.5,11)
fig.savefig('boxes_bad.png',dpi=300)  # Lines are too thick

fig.set_size_inches(17,22)
fig.savefig('boxes_good.png',dpi=150)  # Lines are just right

fig.set_size_inches(8.5,11)
plt.savefig('boxes.pdf')  # Lines are too thick

fig.set_size_inches(17,22) # Lines are just right
plt.savefig('boxes.pdf')   # but the PDF needs scaling before printing

所以我正在寻找一种方法来调整整个图形的线宽,或者让 matplotlib 保存一个具有与 figsize 不同的维度元数据的 pdf。有什么建议吗?

【问题讨论】:

    标签: python pdf matplotlib dpi


    【解决方案1】:

    我建议通过 rcParams(或您的 matplotlibrc 文件)调整线宽等参数:

    # mp.rcParams['figure.figsize'] = fig_size  # set figure size
    mp.rcParams['font.size'] = font_size
    mp.rcParams['axes.labelsize'] = font_size
    mp.rcParams['axes.linewidth'] = font_size / 12.
    mp.rcParams['axes.titlesize'] = font_size
    mp.rcParams['legend.fontsize'] = font_size
    mp.rcParams['xtick.labelsize'] = font_size
    mp.rcParams['ytick.labelsize'] = font_size
    

    我通常使用标准的figure.figsize,即(8,6),轴对象中的线宽为字体大小的1/12(例如,font_size = 16,当我在双栏论文中包含绘图时)。

    请记住,矢量图并不意味着所有线条和字母在缩放时总是具有相同的大小。这意味着您可以在不损失质量或清晰度的情况下进行缩放(粗略地说)。

    【讨论】:

      【解决方案2】:

      谢谢 Marius,只要我获得 15 点声望,我就会投票。虽然您的 rcParams 与我想要做的不太匹配,但 rcParams 本身是正确的查看位置,因此我通过 rcParams.keys() 列出了包含“linewidth”的 rcParams:

      >>> [s for s in mp.rcParams.keys() if 'linewidth' in s]
      ['axes.linewidth', 'grid.linewidth', 'lines.linewidth', 'patch.linewidth']
      

      经过一些实验,我匹配了每个参数控制的内容:
      mp.rcParams['axes.linewidth']:围绕整个绘图的正方形(不是刻度,不是 y= 0 line)
      mp.rcParams['grid.linewidth']:没测试,大概是网格宽度
      mp.rcParams['lines.linewidth']: 使用 pyplot.plot 绘制的线图的宽度
      mp.rcParams['patch.linewidth']: 矩形笔划的宽度,包括 pyplot.bar 图的条、图例,以及条形图的图例标签
      mp.rcParams['xtick.minor.width']:小xticks的线宽(yticks类似)
      mp.rcParams[' xtick.major.width']:大xticks的线宽(yticks类似)

      我最终使用的具体解决方案是

      mp.rcParams['axes.linewidth'] = .5
      mp.rcParams['lines.linewidth'] = .5
      mp.rcParams['patch.linewidth'] = .5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        相关资源
        最近更新 更多