我有一个人物的一些相当微妙的特点是敏感的线条宽度。我想把这个图保存为一个易于打印的PDF格式(即接收器端没有缩放,只需命令+P和Go)。不幸的是,当我设置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
这里是源文件(我已经将绘图简化为Essentials,因此明显的样式解决方案可能不是可行的解决方案)
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。有什么建议吗?
最佳答案
谢谢马吕斯,只要我得到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.lineidth']:整个绘图周围的正方形(不是记号,不是y=0行)
mp.rcparams['grid.lineidth']:没有测试,大概是网格宽度。
mp.rcparams['lines.lineidth']:使用pyplot.plot生成的线条图的宽度
mp.rcparams['patch.lineidth']:矩形笔划的宽度,包括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