2013-04-18 5 views
6

線幅に敏感なかなり繊細なフィーチャがいくつかあります。この図を簡単に印刷できるPDFとして保存します(つまり、受信者の側でスケーリングを行わず、Command + Pを押して移動します)。残念ながら、印刷用にPDFのサイズを正しく設定するためにfigsize =(8.5,11)を設定すると、matplotlibは非常に太いデフォルトの線幅とテキストサイズを選択してプロットを乱してしまいます(凡例は大きすぎます)オーバーラップ)。私がfigsize =(17,22)を設定した場合、印刷のためにPDFを50%にスケーリングした後、非常に実行可能なデフォルトの線幅とテキストサイズが得られます。これは私が使ってきたことですが、その解決策は政治のために役に立たなくなってしまい、変更を行うたびにPDFをイラストレーターに拡大したくありません。matplotlib PDFを保存するときの線幅

ビットマップを使用することができたら、dpiパラメータを無視しているように見えるので、figsize =(17,22)に設定してdpiを目標dpiの半分に設定することで希望の結果を得ることができました。 。私は

  • を編集することができboxes_good.png(細い線でサイズだまさビットマップ、小さなテキスト)(それがないようにまたは印刷物)
  • が8.5x11in寸法を持っているように見えるPDFを希望しますイラストレーターのビットマップではありません。

PDFとして保存するときに「ダブルサイズ、ハーフdpi」のトリックを簡単に取り込む方法があるとは思いますが、それを働かせることをあきらめ、線幅とテキストサイズを直接操作しようとしました。 textsizeは変更できましたが、線幅は変更できませんでした。ここに私が試した事の記録は次のとおりです。ここで

# 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 

はsourcefileのです(私は必需品へのプロットが低下しているので、明白なスタイリングの回避策は、おそらく実行可能なソリューションではありません)

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を保存させる方法をとっています。助言がありますか?

答えて

7

ありがとうマリウス、私はそうするために必要な15の評判を取得するとすぐにupvoteします。あなたのrcParamsはかなり私がやってみたかったものと一致しませんでしたが、rcParams自身が見て正しい場所だったので、私はrcParams.keys()を経由して「線幅」を含むrcParams記載されている:いくつかの実験をした後

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

を、私はマッチ各paramは制御何アップ:
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 
4

私は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 

私は普通(8,6)で、軸における線幅は、それがの1/12でどのオブジェクトfigure.figsize標準を使用しますフォントサイズ(例えば、2列の用紙にプロットを含めるとfont_size = 16)。

ベクターグラフィックスは、スケーリングの際に、すべての行と文字が常に同じサイズになることを意味するわけではありません。つまり、品質や鮮明度を失うことなく(大まかに言えば)拡大縮小することができます。

関連する問題