it-swarm.com.de

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

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

Ich weiß, wie man die Tick-Label-Größen ändert. Dies geschieht mit:

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

Aber wie ändert man den Rest?

430
Herman Schaaf

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 font angegebene Schriftart festgelegt.

Alternativ können Sie auch die Methode rcParamsupdate verwenden, wie in diese Antwort :

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 Anpassen von matplotlib .

493
Herman Schaaf

Wenn Sie ein Kontrollfreak wie ich sind, möchten Sie möglicherweise explizit alle Ihre Schriftgrößen 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, die die rc -Methode für matplotlib aufrufen:

import matplotlib

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

# and so on ...
190
Pedro M Duarte
matplotlib.rcParams.update({'font.size': 22})
176
Marius Retegan

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)
169
ryggyr

Update: Eine etwas bessere Vorgehensweise finden Sie am Ende der Antwort.
Update Nr. 2: Ich habe auch herausgefunden, wie sich die Schriftart für Legendentitel ändert.
Update Nr. 3: Es gibt einen Fehler in Matplotlib 2.0. , der Tickbeschriftungen für logarithmische Achsen verursacht um zur Standardschrift zurückzukehren. Sollte in 2.0.1 behoben sein, aber ich habe die Problemumgehung in den zweiten Teil der Antwort aufgenommen.

Diese Antwort richtet sich an alle, die versuchen, alle Schriftarten, einschließlich der Legende, zu ändern, und an alle, die versuchen, für jede Sache unterschiedliche Schriftarten und -größen zu verwenden. Rc wird nicht verwendet (was bei mir nicht zu funktionieren scheint). Es ist ziemlich umständlich, aber ich konnte mich mit keiner anderen Methode persönlich auseinandersetzen. Es kombiniert im Grunde 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 die Verwendung mehrerer Schriftwörterbücher unabhängig voneinander verschiedene Schriftarten/-größen/-stärken/-farben für die verschiedenen Titel, die Schriftart für die Teilstrichbeschriftungen und die Schriftart für die Legende auswählen können.


UPDATE:

Ich habe einen etwas anderen, weniger überfüllten Ansatz entwickelt, der Schriftenwörterbücher überflüssig macht und alle Schriften auf Ihrem System zulässt, auch .otf-Schriften. Um separate Schriften für jede Sache zu haben, schreiben Sie einfach mehr font_path und 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

59
binaryfunt

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

Ändern Sie die Abbildungsgröße !

Normalerweise benutze ich folgenden Code:

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)

DaskleinerSie machen die Figur größer, dasgrößerdie Schrift istrelativ zur Handlung. Dadurch werden auch die Markierungen erhöht. Hinweis: Ich habe auch dpi oder Punkt pro Zoll festgelegt. Das habe ich aus einem Beitrag im AMTA-Forum (American Modeling Teacher of America) erfahren. Beispiel aus obigem Code: enter image description here

28
Prof Huster

Benutze plt.tick_params(labelsize=14)

15

Sie können plt.rcParams["font.size"] zum Einstellen von font_size in matplotlib und plt.rcParams["font.family"] zum Einstellen von font_family in matplotlib verwenden. 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')
7
hamed baziyad

Basierend auf den oben genannten Sachen:

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
nvd

Dies ist eine Erweiterung zu Marius Retegan Antwort . Sie können eine separate JSON-Datei mit all Ihren Änderungen 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": ""
}
2
Michael H.

Ich stimme völlig mit Prof. Huster überein, dass die einfachste Vorgehensweise 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, weil die Achsenbeschriftungen geschnitten wurden.

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