保存 PDF 时的 matplotlib 线宽

2024-04-25

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

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

  • 看起来像boxes_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。有什么建议么?


谢谢 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 线)
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存 PDF 时的 matplotlib 线宽 的相关文章

随机推荐

  • 预处理在编译器中到底意味着什么

    我试图理解 typedef 和 Define 之间的区别 专门有很多好帖子上一个关于SO的问题 https stackoverflow com questions 1666353 is typedef and define the same
  • 使用 CSS 3 选择第一个表中的第一个 td

    比如说我有 div table tr td td td td tr tr td td td td tr table table tr td td td td tr tr td td td td tr table div
  • html5中的canvas元素是否硬件加速?

    我对 Web 开发还很陌生 事实上我正在考虑深入研究 html 和 js 来进行游戏开发 因此 在做任何事情之前 我需要知道 html5 中的 canvas 元素是否是硬件加速的 如果不是 那么我需要使用像 webgl 这样的东西 我不知道
  • 在ElasticSearch中搜索没有时间的日期字段值

    我的数据中有一个日期字段为 type date format dateOptionalTime 现在我的日期字段和值是 INITIAL EXTRACT DATE 2015 04 02T06 47 57 78 05 30 在搜索时 我仅根据
  • 在 React 中使用 document.execCommand 将文本从 div 复制到剪贴板

    我正在尝试从divURL被缩短后 我已经放置了一个ref值在div这将呈现缩短的 URL 但是 我收到错误 类型错误 inputArea input select 不是函数 我不知道如何引用 div 中的文本 import useCallb
  • 使用 onclick 从输入中获取值

    如何使用 vanilla javascript 获取点击时输入的值 function getvalue console log this val
  • ModuleNotFoundError:Python 3.6 中没有名为“openpyxl”的模块

    我已经通过pip安装了openpyxl openpyxl 包位于以下路径中 AppData Local Programs Python Python36 32 Lib site packages 我正在使用pycharm 在我的代码中 如果
  • Rails 4.0 与 Devise。嵌套属性 不允许的参数

    我正在使用 Devise 和 Rails 4 开发一个网络应用程序 我有一个User我用 2 个额外的表单字段扩展了该模型 这样当用户注册时 他还可以提交他的名字 姓氏 基于http blog 12spokes com web design
  • Python二维数组-更改元素[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有这个 7x7 二维数组 l 1 1 1 1 1 1 1 1 0 2 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0
  • 类型衰减——它是什么以及为什么会出现?

    我很惊讶类型衰减在 SO 或其他地方没有得到很好的解释 也许我没有使用正确的术语进行搜索 或者也许我没有正确理解整个事情 我的问题是 它是什么 它是如何 为什么 到达那里的 它的规则是什么 如果你想知道我为什么问 下面是我的哭泣型腐烂故事
  • Kinect 启用流时出错

    这是我第一次尝试制作一个使用 Kinect 的程序 我不知道为什么我总是得到一个null错误 也许更了解 KinectSDK 的人可以提供帮助 public ProjKinect InitializeComponent updateSens
  • 使用 GCC 为 Linux 设备驱动程序编译 Intel AVX 内联

    我在 corei7 上的 ubuntu 上运行 gcc 版本 4 8 2 从谷歌搜索中找到了有关 AVX 内在函数的信息 但我不确定这组内在函数是否可以用于 Linux 设备驱动程序并进行编译 如果可以的话 这里的任何人都可以告诉我 mak
  • 将列添加到 CSV Windows PowerShell

    我有一个相当标准的 csv 文件 其中包含标题 我想添加一个新列并将所有行设置为相同的数据 原来的 column1 column2 1 b 2 c 3 5 After column1 column2 column3 1 b setvalue
  • 如何在vim中每隔几行添加一行

    我想使用 vim 编辑器在文件 大约 1000 行 中每 3 行添加一行 有人可以帮我吗 谢谢 艾丽莎 有一个 vim 特定的正则表达式可以做到这一点 s n n n 0 r g s 是 vim ex 命令来替换整个文件 n 是包含行尾的一
  • 使用 AWS CodeDeploy 的环境变量

    我有一个 Web 应用程序 它利用环境变量进行某些配置 数据库凭据 API 密钥等 我目前正在使用 Elastic Beanstalk 进行部署 并且可以在 AWS 中轻松设置这些 这很棒 因为我的代码库中没有这些敏感数据 不过 我正在考虑
  • 指南针手表编译一次,无法注意到进一步的变化

    我在 Windows 7 上使用 SASS Compass 我最近将 SASS 从 3 2 10 升级到 3 4 2 将 Compass 从 0 12 2 升级到 1 0 1 我通过卸载旧版本并在命令提示符中使用 gem uninstall
  • 使用状态模式设计在Java中实现通信协议

    如果在其他地方回答了这个问题 我们深表歉意 找不到足够的信息来说服自己最好的方法来做到这一点 我还意识到这是一个冗长的解释 没有代码 但是让我知道我是否应该编写一些示例代码来帮助演示我正在做的事情 基本上 使用 System in out
  • 在 Windows 上忽略 Git 存储库中的目录

    如何在 Windows 上使用 msysgit 忽略 Git 中的目录或文件夹 创建一个名为 gitignore在您的项目目录中 通过在文件中输入目录名称 附加斜杠 来忽略目录 dir to ignore 更多信息是here http gi
  • 如何使 std::cin 读取空格? [复制]

    这个问题在这里已经有答案了 我知道这个问题之前已经在这个网站上被问过 但我似乎无法掌握如何让它与我的特定程序一起工作 本质上 我正在创建一种小型 MadLibs 类型的游戏 玩家必须输入某些内容才能将其融入故事中 现在 如果用户输入中没有空
  • 保存 PDF 时的 matplotlib 线宽

    我有一个具有一些对线宽敏感的相当微妙的特征的图形 我想将此图保存为可以轻松打印的 PDF 即接收器端无需缩放 只需 Command P 即可 不幸的是 当我设置 Figsize 8 5 11 以便正确调整 PDF 的打印大小时 matplo