2016-03-25 2 views
8

В настоящее время я пытаюсь использовать Seaborn для создания графиков для своих научных работ. Участки выглядят великолепно и легко сгенерированы, но одна проблема, с которой у меня возникают проблемы, - это тонкий контроль над размером шрифта на графиках.Тонкий контроль над размером шрифта на морских судах для академических работ

Размер моего шрифта в моей статье - 9pt, и я хотел бы убедиться, что размер шрифта на моих участках составляет 9pt или 10pt. Но в морском стиле размер шрифта в основном контролируется с помощью шкалы шрифтов sns.set_context("paper", font_scale=0.9). Поэтому мне трудно найти правильный размер шрифта, за исключением проб и ошибок. Есть ли более эффективный способ сделать это?

Я также хочу, чтобы размер шрифта был согласован между различными морскими графиками. Но не все мои морские сюжеты имеют одинаковые размеры, поэтому кажется, что с помощью тот же font_scale на всех участках не обязательно создает одинаковый размер шрифта на этих разных участках?

Я прикрепил свой код ниже. Я ценю любые комментарии о том, как отформатировать сюжет для двухколоночной учебной статьи. Моя цель - иметь возможность контролировать размер фигуры без искажения размера шрифта или графика. Я использую 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')           
+1

Я не совсем уверен, что ваш вопрос здесь.Вы можете предоставить размер шрифта различным параметрам rc, связанным с шрифтом, для изменения значений по умолчанию, и вы можете передать шрифт для любой конкретной функции построения, чтобы указать шрифты для создаваемых элементов. 'font_scale' - это не единственный способ сделать это, это просто удобный способ сразу изменить многие вещи. – mwaskom

+0

Не отвечая на этот вопрос, но, возможно, обратившись к фундаментальному изменению подхода. Посмотрите на пакет ['psfrag'] (https://www.ctan.org/pkg/psfrag?lang=en). Это позволяет вам заменять символы на фигуре строками. – Schorsch

+1

@mwaskom Вы ответили на мой вопрос - укажите размер шрифта через rc. Но одна вещь, которая, на мой взгляд, неплохо бы иметь в море, - это указать шрифт_размер, который глобально применяется ко всем свойствам шрифта. Поскольку я использую rc, я должен индивидуально установить каждый параметр шрифта (например, axes.labelsize, legend.fontsize). – kc2uno

ответ

6

Вы правы. Это плохо документированная проблема. Но вы можете изменить параметр размера шрифта (в отличие от шкалы шрифтов) непосредственно после построения графика. Проверьте следующий пример:

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 такое же. Кстати, это также возможность настроить бит rc dictionaries, так как существует параметр «font.size», но я не слишком уверен, как это сделать.

ПРИМЕЧАНИЕ. И также я не понимаю, почему они изменили имя переменных размера шрифта для меток осей и тиков. Кажется немного неинтуитивным.

5

Это почти удовлетворительно, не так ли? Самый простой способ я нашел, чтобы указать при настройке контекста, например .:

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

Это должно заботиться о 90% стандартного черчения использования. Если вы хотите ticklabels меньше осей меток, установите «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}) 

Конечно, вы можете использовать configuration files, но я предполагаю, что идея заключается в том, чтобы иметь простой, прямой метод, поэтому выше работает хорошо.

Примечание: Если вы укажете эти цифры, то указать font_scale в sns.set_context будет проигнорирован для всех указанных элементов шрифта, даже если вы его установили.

+0

Бонусная оговорка для цифр оценки публикации (не задано, поэтому не часть ответа): вы можете указать 'dpi' с' plt.figure', но не с 'plt.subplots', поэтому вы должны указать его при сохранении' plt.savefig (имя файла, dpi = 500) '([здесь] (http://stackoverflow.com/questions/34028255/set-height-and-width-of-figure-created-with-plt-subplots-in- Matplotlib/37405530 # 37405530)) – TNT

Смежные вопросы