Jak zmienić rozmiar czcionki na wykresie matplotlib

542

Jak zmienić rozmiar czcionki dla wszystkich elementów (tików, etykiet, tytułu) na wykresie matplotlib?

Wiem, jak zmienić rozmiary etykiet kleszczy, odbywa się to za pomocą:

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 

Ale jak zmienić resztę?

Herman Schaaf
źródło

Odpowiedzi:

629

Z dokumentacji matplotlib ,

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 22}

matplotlib.rc('font', **font)

Czcionka wszystkich elementów do czcionki określonej przez obiekt kwargs ten zbiorami font.

Ewentualnie możesz również użyć rcParams updatemetody sugerowanej w tej odpowiedzi :

matplotlib.rcParams.update({'font.size': 22})

lub

import matplotlib.pyplot as plt
plt.rcParams.update({'font.size': 22})

Możesz znaleźć pełną listę dostępnych właściwości na stronie Dostosowywanie matplotlib .

Herman Schaaf
źródło
2
miło, tyle że zastępuje wszelkie znalezione po drodze właściwości
czcionek
2
Gdzie mogę znaleźć więcej elementów, takich jak opcje 'family', 'weight'itp?
haccks
2
@HermanSchaaf; Odwiedziłem tę stronę wcześniej. Chciałbym poznać wszystkie opcje 'family'Like 'normal', 'sans-serif'itp
haccks
77
Ponieważ wiele osób zaczyna się import matplotlib.pyplot as plt, można przypomnieć, że pyplotma rctak dobrze. Możesz to zrobić plt.rc(...bez konieczności zmiany importu.
LondonRob
21
Dla niecierpliwych: Domyślny rozmiar czcionki to 10, jak w drugim łączu.
FvD
303

Jeśli jesteś maniakiem kontroli, takim jak ja, możesz jawnie ustawić wszystkie rozmiary czcionek:

import matplotlib.pyplot as plt

SMALL_SIZE = 8
MEDIUM_SIZE = 10
BIGGER_SIZE = 12

plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title

Pamiętaj, że możesz również ustawić rozmiary wywołując rcmetodę na matplotlib:

import matplotlib

SMALL_SIZE = 8
matplotlib.rc('font', size=SMALL_SIZE)
matplotlib.rc('axes', titlesize=SMALL_SIZE)

# and so on ...
Pedro M. Duarte
źródło
9
Próbowałem wielu odpowiedzi. Ten wygląda najlepiej, przynajmniej w zeszytach Jupyter. Po prostu skopiuj powyższy blok u góry i dostosuj trzy stałe wielkości czcionki.
fviktor
3
Zgadzam się z fvitkor, to najlepsza odpowiedź!
SeF
9
Dla mnie rozmiar tytułu nie działał. Użyłem:plt.rc('axes', titlesize=BIGGER_SIZE)
Fernando Irarrázaval G
1
Myślę, że możesz połączyć wszystkie ustawienia dla tego samego obiektu w jedną linię. Np.plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
BallpointBen
198
matplotlib.rcParams.update({'font.size': 22})
Marius Retegan
źródło
1
Być może to rozwiązanie działa tylko wtedy, gdy utworzę pierwszy wykres, a następnie „zaktualizuj” zgodnie z sugestią, co prowadzi do zaktualizowanego rozmiaru czcionki dla nowych rysunków. Może pierwszy wątek jest niezbędny do zainicjowania rcParams ...
Songio
191

Jeśli chcesz zmienić rozmiar czcionki dla określonego wykresu, który został już utworzony, spróbuj tego:

import matplotlib.pyplot as plt

ax = plt.subplot(111, xlabel='x', ylabel='y', title='title')
for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
             ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(20)
ryggyr
źródło
1
Moim celem było, aby czcionki xy, tiki i tytuły miały różne rozmiary. Zmodyfikowana wersja tego działa tak dobrze dla mnie.
Ébe Isaac
6
Aby uzyskać legendy, użyj ax.legend (). Get_texts (). Testowane na Matplotlib 1.4.
James S.
To najbardziej odpowiada na pytanie. Dziękuję Ci.
jimh
Może potrzebować, ax=plt.gca()jeśli wykres został utworzony bez definiowania osi.
dylnan
@JamesS. Raczej użyj ax.get_legend().get_texts(), ponieważ ax.legend()przerysowuje całą legendę z domyślnymi parametrami nad zwracaniem wartości ax.get_legend().
Guimoute
69

Aktualizacja: patrz na dole odpowiedzi, aby uzyskać nieco lepszy sposób na zrobienie tego.
Aktualizacja nr 2: Wymyśliłem też zmianę czcionek tytułu legendy.
Aktualizacja nr 3: W Matplotlib 2.0.0 występuje błąd, który powoduje, że etykiety podziałek dla osi logarytmicznych powracają do domyślnej czcionki. Powinien zostać naprawiony w wersji 2.0.1, ale obejrzałem to obejście w drugiej części odpowiedzi.

Ta odpowiedź jest dla każdego, kto próbuje zmienić wszystkie czcionki, w tym dla legendy, i dla każdego, kto próbuje użyć różnych czcionek i rozmiarów dla każdej rzeczy. Nie używa rc (co wydaje się nie działać dla mnie). Jest to raczej kłopotliwe, ale nie mogłem osobiście poradzić sobie z żadną inną metodą. Zasadniczo łączy odpowiedź ryggyr tutaj z innymi odpowiedziami na temat SO.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

# Set the font dictionaries (for plot title and axis titles)
title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Bottom vertical alignment for more space
axis_font = {'fontname':'Arial', 'size':'14'}

# Set the font properties (for use in legend)   
font_path = 'C:\Windows\Fonts\Arial.ttf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Set the tick labels font
for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontname('Arial')
    label.set_fontsize(13)

x = np.linspace(0, 10)
y = x + np.random.normal(x) # Just simulates some data

plt.plot(x, y, 'b+', label='Data points')
plt.xlabel("x axis", **axis_font)
plt.ylabel("y axis", **axis_font)
plt.title("Misc graph", **title_font)
plt.legend(loc='lower right', prop=font_prop, numpoints=1)
plt.text(0, 0, "Misc text", **title_font)
plt.show()

Zaletą tej metody jest to, że mając kilka słowników czcionek, możesz wybierać różne czcionki / rozmiary / gramatury / kolory dla różnych tytułów, wybierać czcionkę dla etykiet zaznaczenia i wybierać czcionkę dla legendy, wszystkie niezależnie.


AKTUALIZACJA:

Opracowałem nieco inne, mniej zagracone podejście, które eliminuje słowniki czcionek i dopuszcza dowolną czcionkę w twoim systemie, nawet czcionki .otf. Aby mieć osobne czcionki dla każdej rzeczy, po prostu napisz więcej font_pathi font_proppolub zmienne.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
import matplotlib.ticker
# Workaround for Matplotlib 2.0.0 log axes bug https://github.com/matplotlib/matplotlib/issues/8017 :
matplotlib.ticker._mathdefault = lambda x: '\\mathdefault{%s}'%x 

# Set the font properties (can use more variables for more fonts)
font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Define the data to be plotted
x = np.linspace(0, 10)
y = x + np.random.normal(x)
plt.plot(x, y, 'b+', label='Data points')

for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontproperties(font_prop)
    label.set_fontsize(13) # Size here overrides font_prop

plt.title("Exponentially decaying oscillations", fontproperties=font_prop,
          size=16, verticalalignment='bottom') # Size here overrides font_prop
plt.xlabel("Time", fontproperties=font_prop)
plt.ylabel("Amplitude", fontproperties=font_prop)
plt.text(0, 0, "Misc text", fontproperties=font_prop)

lgd = plt.legend(loc='lower right', prop=font_prop) # NB different 'prop' argument for legend
lgd.set_title("Legend", prop=font_prop)

plt.show()

Mam nadzieję, że jest to wyczerpująca odpowiedź

binaryfunt
źródło
40

Oto zupełnie inne podejście, które zadziwiająco dobrze zmienia rozmiary czcionek:

Zmień rozmiar figury !

Zwykle używam takiego kodu:

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(4,3))
ax = fig.add_subplot(111)
x = np.linspace(0,6.28,21)
ax.plot(x, np.sin(x), '-^', label="1 Hz")
ax.set_title("Oscillator Output")
ax.set_xlabel("Time (s)")
ax.set_ylabel("Output (V)")
ax.grid(True)
ax.legend(loc=1)
fig.savefig('Basic.png', dpi=300)

Im mniejszy jest rozmiar figury, tym większa jest czcionka względem wykresu . To również skaluje znaczniki. Uwaga Ustawiam także dpikropkę lub na cal. Nauczyłem się tego na forum AMTA (American Modeling Teacher of America). Przykład z powyższego kodu:wprowadź opis zdjęcia tutaj

Prof Huster
źródło
7
Aby uniknąć odcięcia etykiety osi, zapisz cyfrę z bbox_inchesargumentem fig.savefig('Basic.png', bbox_inches="tight")
Paw
Co jeśli NIE zapisuję figury? Planuję w Notatniku Juypter i wynikowe etykiety osi zostają odcięte.
Zythyr,
Dzięki! Wskazanie ustawień dpi bardzo mi
pomogło
27

Posługiwać się plt.tick_params(labelsize=14)

Andrey Nikishaev
źródło
4
Dziękujemy za fragment kodu, który może zapewnić pewną ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego długoterminową wartość , opisując, dlaczego jest to dobre rozwiązanie problemu i uczyniłoby to bardziej użytecznym dla przyszłych czytelników z innymi podobnymi pytaniami. Edytuj swoją odpowiedź, aby dodać wyjaśnienie, w tym przyjęte założenia.
sepehr
22

Można użyć plt.rcParams["font.size"]do ustawiania font_sizew matplotlib, a także można wykorzystywać plt.rcParams["font.family"]do ustawiania font_familyw matplotlib. Spróbuj tego przykładu:

import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')

label = [1,2,3,4,5,6,7,8]
x = [0.001906,0.000571308,0.0020305,0.0037422,0.0047095,0.000846667,0.000819,0.000907]
y = [0.2943301,0.047778308,0.048003167,0.1770876,0.532489833,0.024611333,0.157498667,0.0272095]


plt.ylabel('eigen centrality')
plt.xlabel('betweenness centrality')
plt.text(0.001906, 0.2943301, '1 ', ha='right', va='center')
plt.text(0.000571308, 0.047778308, '2 ', ha='right', va='center')
plt.text(0.0020305, 0.048003167, '3 ', ha='right', va='center')
plt.text(0.0037422, 0.1770876, '4 ', ha='right', va='center')
plt.text(0.0047095, 0.532489833, '5 ', ha='right', va='center')
plt.text(0.000846667, 0.024611333, '6 ', ha='right', va='center')
plt.text(0.000819, 0.157498667, '7 ', ha='right', va='center')
plt.text(0.000907, 0.0272095, '8 ', ha='right', va='center')
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.size"] = "50"
plt.plot(x, y, 'o', color='blue')
Hamed Baziyad
źródło
10

Oto, czego zwykle używam w Jupyter Notebook:

# Jupyter Notebook settings

from IPython.core.display import display, HTML
display(HTML("<style>.container { width:95% !important; }</style>"))
%autosave 0
%matplotlib inline
%load_ext autoreload
%autoreload 2

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"


# Imports for data analysis
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.max_rows', 2500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_colwidth', 2000)
pd.set_option('display.width', 2000)
pd.set_option('display.float_format', lambda x: '%.3f' % x)

#size=25
size=15
params = {'legend.fontsize': 'large',
          'figure.figsize': (20,8),
          'axes.labelsize': size,
          'axes.titlesize': size,
          'xtick.labelsize': size*0.75,
          'ytick.labelsize': size*0.75,
          'axes.titlepad': 25}
plt.rcParams.update(params)
stackoverflowuser2010
źródło
8

Na podstawie powyższych rzeczy:

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

fontPath = "/usr/share/fonts/abc.ttf"
font = fm.FontProperties(fname=fontPath, size=10)
font2 = fm.FontProperties(fname=fontPath, size=24)

fig = plt.figure(figsize=(32, 24))
fig.text(0.5, 0.93, "This is my Title", horizontalalignment='center', fontproperties=font2)

plot = fig.add_subplot(1, 1, 1)

plot.xaxis.get_label().set_fontproperties(font)
plot.yaxis.get_label().set_fontproperties(font)
plot.legend(loc='upper right', prop=font)

for label in (plot.get_xticklabels() + plot.get_yticklabels()):
    label.set_fontproperties(font)
nvd
źródło
5

Jest to rozszerzenie do Marius Retegan odpowiedź . Możesz utworzyć osobny plik JSON ze wszystkimi modyfikacjami, a następnie załadować go za pomocą rcParams.update. Zmiany będą miały zastosowanie tylko do bieżącego skryptu. Więc

import json
from matplotlib import pyplot as plt, rcParams

s = json.load(open("example_file.json")
rcParams.update(s)

i zapisz plik „example_file.json” w tym samym folderze.

{
  "lines.linewidth": 2.0,
  "axes.edgecolor": "#bcbcbc",
  "patch.linewidth": 0.5,
  "legend.fancybox": true,
  "axes.color_cycle": [
    "#348ABD",
    "#A60628",
    "#7A68A6",
    "#467821",
    "#CF4457",
    "#188487",
    "#E24A33"
  ],
  "axes.facecolor": "#eeeeee",
  "axes.labelsize": "large",
  "axes.grid": true,
  "patch.edgecolor": "#eeeeee",
  "axes.titlesize": "x-large",
  "svg.fonttype": "path",
  "examples.directory": ""
}
Michael H.
źródło
4

Całkowicie zgadzam się z profesorem Husterem, że najprostszym sposobem jest zmiana rozmiaru rysunku, co pozwala zachować domyślne czcionki. Musiałem tylko uzupełnić to opcją bbox_inches podczas zapisywania figury jako pdf, ponieważ wycięto etykiety osi.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')

źródło