web-dev-qa-db-fra.com

Contrôle précis de la taille de la police dans les tracés Seaborn pour les articles universitaires

J'essaie actuellement d'utiliser Seaborn pour créer des tracés pour mes articles universitaires. Les tracés sont superbes et faciles à générer, mais un problème avec lequel j'ai du mal est d'avoir un contrôle précis sur la taille de la police dans les tracés.

Ma taille de police dans mon papier est de 9 pt et je voudrais m'assurer que la taille de police dans mes tracés est de 9 pt ou 10 pt. Mais dans seaborn, la taille de la police est principalement contrôlée par l'échelle de police sns.set_context("paper", font_scale=0.9). Il est donc difficile pour moi de trouver la bonne taille de police, sauf par essais et erreurs. Existe-t-il un moyen plus efficace de procéder?

Je veux également m'assurer que la taille de la police est cohérente entre les différents graphiques seaborn. Mais tous mes tracés nés en mer n'ont pas la même dimension, il semble donc que l'utilisation de même font_scale sur tous les tracés ne crée pas nécessairement la même taille de police sur ces différents tracés?

J'ai joint mon code ci-dessous. J'apprécie tout commentaire sur la façon de mettre en forme l'intrigue pour un document académique à deux colonnes. Mon objectif est de pouvoir contrôler la taille de la figure sans déformer la taille de la police ou l'intrigue. J'utilise du latex pour écrire mon papier.

# 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

Vous avez raison. Il s'agit d'un problème mal documenté. Mais vous pouvez modifier le paramètre de taille de police (par opposition à l'échelle de police) directement après la construction du tracé. Vérifiez l'exemple suivant:

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()

, ce qui se traduit par:

Different font sizes for different labels

Pour le rendre cohérent entre les tracés, je pense que vous avez juste besoin de vous assurer que le DPI est le même. Au fait, c'est aussi une possibilité de personnaliser un peu le rc dictionaries puisque le paramètre "font.size" existe mais je ne sais pas trop comment faire.

REMARQUE: Et je ne comprends pas vraiment pourquoi ils ont changé le nom des variables de taille de police pour les étiquettes d'axe et les graduations. Semble un peu peu intuitif.

26
armatita

C'est tout sauf satisfaisant, n'est-ce pas? Le moyen le plus simple que j'ai trouvé pour spécifier lors de la définition du contexte, par exemple:

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

Cela devrait prendre en charge 90% de l'utilisation du traçage standard. Si vous souhaitez que les étiquettes soient plus petites que les étiquettes des axes, définissez la valeur 'axes.labelsize' sur la valeur la plus petite (étiquette) et spécifiez manuellement les étiquettes des axes (ou d'autres éléments personnalisés), par exemple:

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

vous pouvez le définir comme une fonction et le charger dans vos scripts afin que vous n'ayez pas à vous souvenir de vos numéros standard, ou à l'appeler à chaque fois.

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

Bien sûr, vous pouvez utiliser fichiers de configuration , mais je suppose que l'idée globale est d'avoir une méthode simple et directe, c'est pourquoi cela fonctionne bien.

Remarque: Si vous spécifiez ces nombres, spécifiez font_scale dans sns.set_context est ignoré pour tous les éléments de police spécifiés, même si vous le définissez.

14
TNT