So ändern Sie die Schriftgröße in einem Matplotlib-Plot

542

Wie ändert man die Schriftgröße für alle Elemente (Häkchen, Beschriftungen, Titel) in einem Matplotlib-Plot?

Ich weiß, wie man die Größe der Häkchen ändert. Dies geschieht mit:

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

Aber wie ändert man den Rest?

Herman Schaaf
quelle

Antworten:

629

Aus der matplotlib-Dokumentation ,

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

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

Dadurch wird die Schriftart aller Elemente auf die vom kwargs-Objekt angegebene Schriftart festgelegt font.

Alternativ können Sie auch die rcParams updatein dieser Antwort vorgeschlagene Methode verwenden :

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

oder

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

Eine vollständige Liste der verfügbaren Eigenschaften finden Sie auf der Seite Customizing matplotlib .

Herman Schaaf
quelle
2
schön, außer dass es alle auf seinem Weg gefundenen Fontsize-Eigenschaften überschreibt è_é
yota
2
Wo kann ich mehr Optionen für Elemente wie finden 'family', 'weight'usw.?
Haccks
2
@HermanSchaaf; Ich habe diese Seite schon einmal besucht. Ich möchte alle Optionen für wissen , 'family'wie 'normal', 'sans-serif'etc.
haccks
77
Da viele Menschen mit beginnen import matplotlib.pyplot as plt, können Sie gerne darauf hinweisen , dass pyplothat rcauch. Sie können darauf plt.rc(...verzichten, Ihre Importe ändern zu müssen.
LondonRob
21
Für Ungeduldige: Die Standardschriftgröße ist 10, wie im zweiten Link.
FvD
304

Wenn Sie ein Kontrollfreak wie ich sind, möchten Sie möglicherweise alle Ihre Schriftgrößen explizit festlegen:

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

Beachten Sie, dass Sie auch die Größen festlegen können, für die die rcMethode aufgerufen wird matplotlib:

import matplotlib

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

# and so on ...
Pedro M Duarte
quelle
9
Ich habe viele der Antworten ausprobiert. Dieser sieht am besten aus, zumindest in Jupyter-Notizbüchern. Kopieren Sie einfach den obigen Block oben und passen Sie die drei Schriftgrößenkonstanten an.
Fviktor
3
Stimmen Sie mit fvitkor überein, das ist die beste Antwort!
SeF
9
Bei mir hat die Titelgröße nicht funktioniert. Ich benutzte:plt.rc('axes', titlesize=BIGGER_SIZE)
Fernando Irarrázaval G
1
Ich denke, Sie können alle Einstellungen für das gleiche Objekt in einer Zeile kombinieren. ZBplt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
BallpointBen
198
matplotlib.rcParams.update({'font.size': 22})
Marius Retegan
quelle
1
In einigen Fällen funktioniert diese Lösung nur, wenn ich ein erstes Diagramm erstelle und dann wie vorgeschlagen "aktualisiere", was zu einer aktualisierten Schriftgröße für neue Figuren führt. Vielleicht ist der erste Plot notwendig, um rcParams zu initialisieren ...
Songio
191

Wenn Sie die Schriftgröße nur für ein bestimmtes Diagramm ändern möchten, das bereits erstellt wurde, versuchen Sie Folgendes:

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
quelle
1
Mein Ziel war es, die Schriftart von xy-Etiketten, Häkchen und Titeln in verschiedenen Größen zu haben. Eine modifizierte Version davon hat bei mir so gut funktioniert.
Ébe Isaac
6
Um auch die Legenden zu erhalten, verwenden Sie ax.legend (). Get_texts (). Getestet auf Matplotlib 1.4.
James S.
Dies beantwortet die Frage am direktesten. Vielen Dank.
Jimh
Möglicherweise benötigen Sie eine, ax=plt.gca()wenn das Diagramm erstellt wurde, ohne eine Achse zu definieren.
Dylnan
@ JamesS. Verwenden Sie lieber ax.get_legend().get_texts(), da ax.legend()die gesamte Legende mit Standardparametern neu gezeichnet wird, zusätzlich zur Rückgabe des Werts von ax.get_legend().
Guimoute
69

Update: Eine etwas bessere Vorgehensweise finden Sie am Ende der Antwort.
Update Nr. 2: Ich habe herausgefunden, dass sich auch die Schriftarten für Legendentitel ändern.
Update Nr. 3: In Matplotlib 2.0.0 ist ein Fehler aufgetreten , der dazu führt, dass die Tick-Beschriftungen für logarithmische Achsen auf die Standardschrift zurückgesetzt werden. Sollte in 2.0.1 behoben sein, aber ich habe die Problemumgehung in den 2. Teil der Antwort aufgenommen.

Diese Antwort richtet sich an alle, die versuchen, alle Schriftarten zu ändern, einschließlich der Legende, und an alle, die versuchen, für jede Sache unterschiedliche Schriftarten und Größen zu verwenden. Es wird kein RC verwendet (was bei mir nicht zu funktionieren scheint). Es ist ziemlich umständlich, aber ich konnte mich mit keiner anderen Methode persönlich auseinandersetzen. Grundsätzlich kombiniert es Ryggyrs Antwort hier mit anderen Antworten auf 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()

Der Vorteil dieser Methode besteht darin, dass Sie durch mehrere Schriftwörterbücher verschiedene Schriftarten / Größen / Gewichte / Farben für die verschiedenen Titel auswählen, die Schriftart für die Häkchenbeschriftungen und die Schriftart für die Legende unabhängig voneinander auswählen können.


AKTUALISIEREN:

Ich habe einen etwas anderen, weniger überfüllten Ansatz entwickelt, der Schriftwörterbücher überflüssig macht und jede Schriftart auf Ihrem System zulässt, sogar .otf-Schriftarten. Um separate Schriftarten für jede Sache zu haben, schreiben Sie einfach mehr font_pathund font_propähnliche Variablen.

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

Hoffentlich ist dies eine umfassende Antwort

Binärfunt
quelle
40

Hier ist ein völlig anderer Ansatz, der überraschend gut funktioniert, um die Schriftgrößen zu ändern:

Ändern Sie die Figurengröße !

Normalerweise verwende ich Code wie folgt:

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)

Je kleiner Sie die Figurengröße machen, desto größer ist die Schrift relativ zum Plot . Dadurch werden auch die Markierungen hochskaliert. Hinweis Ich habe auch den dpioder Punkt pro Zoll eingestellt. Ich habe dies aus einem Beitrag im AMTA-Forum (American Modeling Teacher of America) gelernt. Beispiel aus dem obigen Code:Geben Sie hier die Bildbeschreibung ein

Prof. Huster
quelle
7
Um zu vermeiden, dass die Achsenbeschriftung abgeschnitten wird, speichern Sie die Abbildung mit dem bbox_inchesArgument fig.savefig('Basic.png', bbox_inches="tight")
Paw
Was ist, wenn ich die Figur NICHT speichere? Ich zeichne in Juypter Notebook und die resultierenden Achsenbeschriftungen werden abgeschnitten.
Zythyr
Vielen Dank! Das Aufzeigen der dpi-Einstellungen war für mich äußerst hilfreich bei der Vorbereitung druckbarer Versionen meiner Diagramme, ohne alle
Zeilengrößen
27

Verwenden plt.tick_params(labelsize=14)

Andrey Nikishaev
quelle
4
Vielen Dank für das Code-Snippet, das möglicherweise nur begrenzte, sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie beschreibt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
September
22

Sie können verwendet werden plt.rcParams["font.size"]für die Einstellung font_sizein matplotlibSie können auch verwendet werden plt.rcParams["font.family"]für die Einstellung font_familyin matplotlib. Versuchen Sie dieses Beispiel:

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
quelle
10

Folgendes verwende ich normalerweise in 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
quelle
8

Basierend auf den oben genannten Dingen:

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
quelle
5

Dies ist eine Erweiterung der Antwort von Marius Retegan . Sie können mit all Ihren Änderungen eine separate JSON-Datei erstellen und diese dann mit rcParams.update laden. Die Änderungen gelten nur für das aktuelle Skript. Damit

import json
from matplotlib import pyplot as plt, rcParams

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

und speichern Sie diese 'example_file.json' im selben Ordner.

{
  "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.
quelle
4

Ich stimme Prof. Huster voll und ganz zu, dass der einfachste Weg darin besteht, die Größe der Abbildung zu ändern, wodurch die Standardschriftarten beibehalten werden können. Ich musste dies nur mit einer Option bbox_inches ergänzen, wenn ich die Figur als PDF speicherte, da die Achsenbeschriftungen geschnitten wurden.

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

quelle