Jak zmienić rozmiar czcionki na wykresie matplotlib

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

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

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 
Ale jak zmienić resztę?
Author: daniel451, 2010-10-10

9 answers

Z dokumentacji matplotlib ,

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

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

Ustawia czcionkę wszystkich elementów na czcionkę określoną przez obiekt kwargs, font.

Alternatywnie, można również użyć rcParams update metoda sugerowana w ta odpowiedź :

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

Lub

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

Pełną listę dostępnych właściwości można znaleźć na stronie dostosowywanie matplotlib .

 357
Author: Herman Schaaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-16 19:37:30
matplotlib.rcParams.update({'font.size': 22})
 156
Author: Marius Retegan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-22 14:46:44

Jeśli chcesz zmienić wielkość czcionki tylko dla określonego wykresu, który już został 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)
 145
Author: ryggyr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-20 02:13:32

Jeśli jesteś maniakiem kontroli jak ja, możesz chcieć wyraźnie 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

Zauważ, że możesz również ustawić rozmiary wywołujące metodę rc na matplotlib:

import matplotlib

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

# and so on ...
 120
Author: Pedro M Duarte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 17:15:45

Update: Zobacz na dole odpowiedzi, aby dowiedzieć się, jak to zrobić.
Update # 2: wymyśliłem też zmianę czcionek tytułu legendy.
Update # 3: jest błąd W Matplotlib 2.0.0 , który powoduje, że etykiety znaczników dla osi logarytmicznych powracają do domyślnej czcionki. Powinno być poprawione w 2.0.1, ale włączyłem obejście w 2 części odpowiedzi.

Ta odpowiedź jest dla każdego, kto próbuje zmienić wszystkie czcionki, w tym dla legend, i dla każdego, kto próbuje użyć różnych czcionek i rozmiarów dla każdej rzeczy. Nie używa rc (co mi nie działa). Jest to dość uciążliwe, ale osobiście nie mogłem uporać się z żadną inną metodą. To w zasadzie łączy odpowiedź ryggyra tutaj z innymi odpowiedziami na 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 wybrać różne czcionki/rozmiary/wagi/kolory dla różnych tytułów, wybrać czcionkę dla etykiet kleszczy, i wybierz czcionkę dla legendy, wszystko niezależnie.


UPDATE:

Wypracowałem nieco inne, mniej zaśmiecone podejście, które eliminuje słowniki czcionek i pozwala nawet na dowolną czcionkę w systemie .czcionki otf. Aby mieć oddzielne czcionki dla każdej rzeczy, po prostu napisz więcej font_path i font_prop Jak 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()

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

 54
Author: binaryfunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 20:07:08

Oto CAŁKOWICIE inne podejście, które działa zaskakująco dobrze, aby zmienić rozmiar czcionki:

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)

mniejszy tworzysz wielkość rysunku, większy czcionka jest względem wykresu . To również skaluje markery. Uwaga ustawiam również dpi lub kropkę na cal. Nauczyłem się tego z postu na forum AMTA (American Modeling Teacher of America). Przykład z powyższy kod: Tutaj wpisz opis obrazka

 19
Author: Prof Huster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 18:08:36

Na podstawie powyższego:

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)
 5
Author: nvd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-19 18:41:56

To jest rozszerzenie do Marius Retegan odpowiedz . Możesz zrobić osobny plik JSON ze wszystkimi swoimi modyfikacjami, a następnie załadować go za pomocą rcParams.aktualizacja. Zmiany będą dotyczyć tylko 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 ' 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": ""
}
 2
Author: Bokje,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 11:24:20

Całkowicie zgadzam się z Prof Husterem, że najprostszym sposobem postępowania jest zmiana wielkości rysunku, co pozwala zachować domyślne czcionki. Musiałem tylko uzupełnić to opcją bbox_inches podczas zapisywania rysunku jako pdf, ponieważ etykiety osi zostały wycięte.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-18 14:28:10