web-dev-qa-db-ja.com

学術論文のSeabornプロットのフォントサイズを細かく制御

現在、Seabornを使用して、学術論文のプロットを作成しようとしています。プロットは見栄えがよく、簡単に生成できますが、私が問題を抱えている問題の1つは、プロットのフォントサイズを細かく制御できることです。

論文のフォントサイズは9ptで、プロットのフォントサイズが9ptまたは10ptであることを確認したいと思います。ただし、Seabornでは、フォントサイズは主にフォントスケールsns.set_context("paper", font_scale=0.9)によって制御されます。したがって、試行錯誤を除いて、適切なフォントサイズを見つけるのは困難です。これを行うためのより効率的な方法はありますか?

また、異なるシーボーンプロット間でフォントサイズが一貫していることを確認したいと思います。しかし、私の生まれたプロットのすべてが同じ次元を持っているわけではないので、すべてのプロットでsame font_scaleを使用しても、これらの異なるプロットで同じフォントサイズが作成されるとは限りませんか?

以下にコードを添付しました。 2列の学術論文用にプロットをフォーマットする方法についてのコメントに感謝します。私の目標は、フォントサイズやプロットを歪めることなく、Figureのサイズを制御できるようにすることです。 Latexを使用して論文を書きます。

# Seaborn setting                                                                                                                                              
sns.set(style='whitegrid', rc={"grid.linewidth": 0.1})
sns.set_context("paper", font_scale=0.9)                                                  
plt.figure(figsize=(3.1, 3)) # Two column paper. Each column is about 3.15 inch wide.                                                                                                                                                                                                                                 
color = sns.color_palette("Set2", 6)

# Create a box plot for my data                                                      
splot = sns.boxplot(data=df, palette=color, whis=np.inf,                              
        width=0.5, linewidth = 0.7)

# Labels and clean up on the plot                                                                                                                                                                                                                                                                                              
splot.set_ylabel('Normalized WS')                                                     
plt.xticks(rotation=90)                                                               
plt.tight_layout()                                                                    
splot.yaxis.grid(True, clip_on=False)                                                 
sns.despine(left=True, bottom=True)                                                   
plt.savefig('test.pdf', bbox_inches='tight')                                          
20
kc2uno

あなたが正しいです。これは文書化された問題です。ただし、プロットを作成した後、フォントサイズパラメーターを(フォントスケールとは反対に)直接変更できます。次の例を確認してください。

import seaborn as sns
tips = sns.load_dataset("tips")

b = sns.boxplot(x=tips["total_bill"])
b.axes.set_title("Title",fontsize=50)
b.set_xlabel("X Label",fontsize=30)
b.set_ylabel("Y Label",fontsize=20)
b.tick_params(labelsize=5)
sns.plt.show()

、これは次のようになります。

Different font sizes for different labels

プロット間で一貫性を保つために、DPIが同じであることを確認する必要があると思います。ちなみに、「font.size」パラメータが存在するので rc辞書 を少しカスタマイズすることもできますが、その方法はあまりわかりません。

注:また、軸ラベルと目盛りのフォントサイズ変数の名前が変更された理由もよくわかりません。少し直感的ではないようです。

26
armatita

それはすべて満足のいくものですよね?コンテキストを設定するときに指定する最も簡単な方法、たとえば:

sns.set_context("paper", rc={"font.size":8,"axes.titlesize":8,"axes.labelsize":5})   

これにより、標準のプロット使用の90%が処理されます。軸ラベルよりも小さい目盛りラベルが必要な場合は、「axes.labelsize」を小さい値(ticklabel)に設定し、軸ラベル(または他のカスタム要素)を手動で指定します。例:

axs.set_ylabel('mylabel',size=6)

関数として定義してスクリプトに読み込むと、標準の数字を覚えたり、毎回呼び出す必要がなくなります。

def set_pubfig:
    sns.set_context("paper", rc={"font.size":8,"axes.titlesize":8,"axes.labelsize":5})   

もちろん、 設定ファイル を使用できますが、全体のアイデアは単純で簡単な方法を使用することであると思います。

注:これらの番号を指定する場合、font_scale in sns.set_contextは、設定した場合でも、指定されたすべてのフォント要素に対して無視されます。

14
TNT