2016-03-25 11 views
8

Obecnie próbuję użyć Seaborn do tworzenia działek dla moich prac naukowych. Wykresy wyglądają świetnie i są łatwe do wygenerowania, ale jednym z problemów, z którymi mam problem, jest precyzyjna kontrola rozmiaru czcionki na wykresach.Dobra kontrola rozmiaru czcionki w działkach Seaborn dla papierów akademickich

Mój rozmiar czcionki w moim referacie to 9pt i chciałbym się upewnić, że rozmiar czcionki na moich działkach wynosi 9pt lub 10pt. Ale u seabornów rozmiar czcionki jest kontrolowany głównie za pomocą skali czcionki sns.set_context("paper", font_scale=0.9). Tak więc trudno mi znaleźć odpowiedni rozmiar czcionki, z wyjątkiem prób i błędów. Czy istnieje skuteczniejszy sposób na zrobienie tego?

Chcę również upewnić się, że rozmiar czcionki jest zgodny między różnymi polami seaborn. Ale nie wszystkie moje seabornowe działki mają ten sam wymiar, więc wydaje się, że użycie tego samego font_scalena wszystkich działkach niekoniecznie powoduje utworzenie tego samego rozmiaru czcionki na tych różnych działkach?

Załączam mój kod poniżej. Doceniam wszelkie uwagi na temat formatowania fabuły dla dwu-kolumnowej pracy naukowej. Moim celem jest móc kontrolować rozmiar figury bez zniekształcania rozmiaru czcionki lub wykresu. Używam Latex do napisania mojej pracy.

# 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

Nie jestem do końca pewien, jakie jest twoje pytanie.Możesz podać rozmiary czcionek dla różnych parametrów rc związanych z czcionkami, aby zmienić ustawienia domyślne, i możesz przekazać fontsize do dowolnej funkcji kreślenia w celu określenia czcionek dla elementów, które tworzy. "font_scale" nie jest jedynym sposobem, aby to zrobić, to po prostu wygodny sposób na zmianę wielu rzeczy naraz. – mwaskom

+0

Nie odpowiadając na to pytanie, ale być może odnosząc się do zasadniczej zmiany podejścia: Spójrz na pakiet ['psfrag'] (https://www.ctan.org/pkg/psfrag?lang=en). Pozwala na zastąpienie znaków na rysunku za pomocą ciągów. – Schorsch

+1

@mwaskom Odpowiedziałeś na moje pytanie - określ rozmiar czcionki za pomocą rc. Ale jedną z rzeczy, które moim zdaniem byłoby miło mieć u seabornów, jest możliwość określenia font_size, która zostanie zastosowana globalnie do wszystkich właściwości czcionki. Ponieważ używając rc, muszę indywidualnie ustawić każdy parametr czcionki (np. Axes.labelsize, legend.fontsize). – kc2uno

Odpowiedz

6

Masz rację. To jest źle udokumentowany problem. Ale możesz zmienić parametr wielkości czcionki (w przeciwieństwie do skali czcionki) bezpośrednio po zbudowaniu wykresu. Sprawdź następujący przykład:

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

, co skutkuje tym:

Different font sizes for different labels

Żeby było spójne między działek Chyba po prostu trzeba upewnić się, że DPI jest taka sama. Nawiasem mówiąc, jest to również możliwość dostosowania trochę rc dictionaries, ponieważ parametr "font.size" istnieje, ale nie jestem zbyt pewny, jak to zrobić.

UWAGA: I tak naprawdę nie rozumiem, dlaczego zmienili nazwę zmiennych wielkości czcionki dla etykiet osi i kleszczy. Wydaje się nieco nieintuicyjny.

5

To wszystko jest satysfakcjonujące, prawda? Najprostszy sposób, jaki określiłem przy ustawianiu kontekstu, np .:

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

Powinno to zająć 90% standardowego wykorzystania plotera. Jeśli chcesz ticklabels mniejszy niż osie etykiet, ustaw „axes.labelsize” na mniejszą wartość (ticklabel) i określić etykiety osi (lub inne elementy niestandardowe) ręcznie, np:

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

można go zdefiniować jako Funkcjonalność i ładuj go w swoich skryptach, aby nie musieć zapamiętywać swoich standardowych numerów lub dzwonić za każdym razem.

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

Oczywiście można użyć configuration files, ale myślę, że cały pomysł jest mieć prosty, bezpośredni sposób, dlatego powyższe działa dobrze.

Uwaga: Jeśli podasz te numery, określenie font_scale w sns.set_context zostanie zignorowane dla wszystkich określonych elementów czcionek, nawet jeśli je ustawisz.

+0

Potwierdzenie bonusu dla liczb ocen publikacji (nie pytano, więc nie jest częścią odpowiedzi): Można określić 'dpi' z' plt.figure', ale nie z 'plt.subplots', więc trzeba to określić przy zapisywaniu' plt.savefig (filename, dpi = 500) '([tutaj] (http://stackoverflow.com/questions/34028255/set-height-and-width-of-figure-created-with-plt-subplots-in- matplotlib/37405530 # 37405530)) – TNT

Powiązane problemy