Wie lege ich die Schriftgröße für Titel und Achsenbeschriftungen in Matplotlib fest?

531

Ich erstelle eine Figur in Matplotlib wie folgt:

from matplotlib import pyplot as plt

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
fig.savefig('test.jpg')

Ich möchte Schriftgrößen für den Figurentitel und die Achsenbeschriftungen angeben. Alle drei müssen unterschiedliche Schriftgrößen haben, daher ist das Festlegen einer globalen Schriftgröße ( mpl.rcParams['font.size']=x) nicht das, was ich möchte. Wie lege ich die Schriftgrößen für den Figurentitel und die Achsenbeschriftungen einzeln fest?

vasek1
quelle
1
Ich war neugierig, also habe ich versucht, Ihre hinzuzufügen mpl.rcParams['font.size'] = 20und Werte auf 10 und 14 zu ändern. Zuerst stellte ich fest, dass ich Fehler bekam, es sei denn, ich wechselte mplzu plt. Diese Änderung löschte den Fehler, aber dann hatte die Codezeile keine Auswirkung auf meine Titel oder Beschriftungen. Sicher, dass diese Syntax richtig ist?
TMWP
Jetzt denke ich aus den Kommentaren zur akzeptierten Antwort, dass das Problem meine Importanweisung sein könnte, obwohl es mir ein Rätsel ist, warum es keinen Fehler auslöst, wenn ich den Befehl nicht importiert habe. Gibt es eine andere Importzeile, die Sie beim Testen des mplBefehls verwendet haben?
TMWP

Antworten:

774

Funktionen mit Text zu tun , wie label, titleetc. akzeptieren Parameter gleich wie matplotlib.text.Text. Für die Schriftgröße können Sie verwenden size/fontsize:

from matplotlib import pyplot as plt    

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title', fontsize=20)
plt.xlabel('xlabel', fontsize=18)
plt.ylabel('ylabel', fontsize=16)
fig.savefig('test.jpg')

Enthält und für globale Einstellungen titleund labelGrößen . (Von der Seite):mpl.rcParamsaxes.titlesizeaxes.labelsize

axes.titlesize      : large   # fontsize of the axes title
axes.labelsize      : medium  # fontsize of the x any y labels

(Soweit ich sehen kann, gibt es keine Möglichkeit, Größen separat festzulegen xund zu ykennzeichnen.)

Und ich sehe, das axes.titlesizehat keinen Einfluss suptitle. Ich denke, Sie müssen das manuell einstellen.

Avaris
quelle
Vielen Dank! Gibt es eine Möglichkeit, dies global, aber explizit für (suptitle, xlabel, ylabel) festzulegen? Ich mache viele Diagramme und möchte es nur einmal spezifizieren ...
vasek1
@ vasek1: Ich dachte du wolltest keine globale Einstellung :). Dafür brauchst du mpl.rcParams. Ich habe meine Antwort bearbeitet.
Avaris
16
Für alle anderen wie mich, die nach einer Lösung suchen, um die Titelgröße zu ändern:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen
rcParamsVerwenden Sie über den Link figure.titlesizezusätzlich zu axes.titlesize.
Mad Physicist
1
@ AlexanderMcFarlane. Ich rannte python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Ergebnis ist 1.5.1, True. 1) Welche Version von matplotlib verwenden Sie? Welche Version von Python? 2) Könnte es ein Fehler sein, den es aus irgendeinem Grund akzeptiert, straber nicht unicodein Py2?
Verrückter Physiker
90

Sie können dies auch global über ein rcParams-Wörterbuch tun:

import matplotlib.pylab as pylab
params = {'legend.fontsize': 'x-large',
          'figure.figsize': (15, 5),
         'axes.labelsize': 'x-large',
         'axes.titlesize':'x-large',
         'xtick.labelsize':'x-large',
         'ytick.labelsize':'x-large'}
pylab.rcParams.update(params)
Tsando
quelle
5
Was sind andere Größen außer 'x-large'?
Martin Thoma
15
'xx-klein', 'x-klein', 'klein', 'mittel', 'groß', 'x-groß', 'xx-groß'. Siehe matplotlib.org/api/…
tsando
Verwenden Sie pylab.rcParams.keys()diese Option , um die vollständige Liste der Parameter anzuzeigen.
Nirmal
Vielen Dank. Gibt es eine Möglichkeit , um global gesetzt explizite numerische Größen für den Titel und die Achse-Etikett , anstatt immer zu tun ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Es scheint, als würde rcParamsnur Zeichenfolgen akzeptiert.
Timgeb
4
Sie können auch Zahlen verwenden ...'axes.labelsize': 32,
Mimoralea
65

Wenn Sie es gewohnt sind, axObjekte zum Plotten zu verwenden, ist es möglicherweise ax.xaxis.label.set_size()einfacher, sich daran zu erinnern, oder zumindest einfacher, die Registerkarte in einem Ipython-Terminal zu verwenden. Es scheint eine Neuzeichnungsoperation zu benötigen, um den Effekt zu sehen. Zum Beispiel:

import matplotlib.pyplot as plt

# set up a plot with dummy data
fig, ax = plt.subplots()
x = [0, 1, 2]
y = [0, 3, 9]
ax.plot(x,y)

# title and labels, setting initial sizes
fig.suptitle('test title', fontsize=12)
ax.set_xlabel('xlabel', fontsize=10)
ax.set_ylabel('ylabel', fontsize='medium')   # relative to plt.rcParams['font.size']

# setting label sizes after creation
ax.xaxis.label.set_size(20)
plt.draw()

Ich kenne keine ähnliche Methode, um die Größe des Untertitels nach seiner Erstellung festzulegen.

Spinup
quelle
fig.suptitle('test title', fontsize = 20)scheint zu funktionieren. ax.set_xlabel('xlabel', fontsize = 20)' also works, in which case we can do away with ax.xaxis.label.set_size (20) `.
T_T
1
@T_T Das stimmt, und diese Formulare ähneln der obigen Antwort von Avaris. Ich werde sie der Vollständigkeit halber hinzufügen. Ich finde immer noch eine Verwendung, ax.xaxis.label.set_size()wenn ich interaktiv mit einem Ipython- Plot arbeite und eine schnelle visuelle Beurteilung einer Vielzahl von Schriftgrößen vornehmen möchte.
Spinup
Wissen Sie, ob es einen (versteckten) Unterschied zwischen der Verwendung von Axtobjekten und Figurenobjekten gibt oder ob beide perfekt gleichwertig sind? Warum gibt es für einige Funktionen unterschiedliche Schnittstellen? (plt.xlabel () vs. ax.set_xlabel ())
normanius
1
@normanius, wenn Sie im obigen Beispiel Axt und Feige meinen, handelt es sich um ganz unterschiedliche Objekte - Abb. ist die Gesamtfigur, die mehrere Achsen enthalten kann. Feige und Axt haben also unterschiedliche Eigenschaften. In Bezug auf den Unterschied zwischen den Aufrufen vom Typ Pyplot und den Aufrufen von Objekten (z. B. plt.xlabel()vs., ax.set_xlabel()wie Sie sagen) sind sie äquivalent, mit der Einschränkung, dass die plt.*Funktionen auf der aktuellen Achse / Figur funktionieren . Wenn Sie also eine Figur mit mehreren Achsen einrichten, möchten Sie wahrscheinlich explizite Aufrufe verwenden ax1.set_xlabel(), um Verwirrung zu vermeiden.
Spinup
20

Um nur die Schriftart des Titels (und nicht die Schriftart der Achse) zu ändern, habe ich Folgendes verwendet:

import matplotlib.pyplot as plt
fig = plt.Figure()
ax = fig.add_subplot(111)
ax.set_title('My Title', fontdict={'fontsize': 8, 'fontweight': 'medium'})

Das fontdict akzeptiert alle kwargs aus matplotlib.text.Text .

Tammoj
quelle
8

Laut offiziellem Leitfaden wird die Verwendung von pylabnicht mehr empfohlen. matplotlib.pyplotsollte stattdessen direkt verwendet werden.

Das globale Einstellen der Schriftgrößen über rcParamssollte mit erfolgen

import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['axes.titlesize'] = 16

# or

params = {'axes.labelsize': 16,
          'axes.titlesize': 16}
plt.rcParams.update(params)

# or

import matplotlib as mpl
mpl.rc('axes', labelsize=16, titlesize=16)

# or 

axes = {'labelsize': 16,
        'titlesize': 16}
mpl.rc('axes', **axes)

Die Standardeinstellungen können mit wiederhergestellt werden

plt.rcParams.update(plt.rcParamsDefault)

Sie können dies auch tun , indem sie die Schaffung eines Stylesheet im stylelibVerzeichnis unter dem matplotlib Konfigurationsverzeichnis (Sie können Ihre Konfigurationsverzeichnis von bekommen matplotlib.get_configdir()). Das Stylesheet-Format ist

axes.labelsize: 16
axes.titlesize: 16

Wenn Sie ein Stylesheet haben /path/to/mpl_configdir/stylelib/mystyle.mplstyle, können Sie es über verwenden

plt.style.use('mystyle')

# or, for a single section

with plt.style.context('mystyle'):
    # ...

Sie können auch eine matplotlibrc-Datei erstellen (oder ändern), die das Format gemeinsam nutzt

axes.labelsize = 16
axes.titlesize = 16

Abhängig davon, welche matplotlibrc-Datei Sie ändern, werden diese Änderungen nur für das aktuelle Arbeitsverzeichnis, für alle Arbeitsverzeichnisse ohne matplotlibrc-Datei oder für alle Arbeitsverzeichnisse ohne matplotlibrc-Datei und für keine andere matplotlibrc-Datei verwendet wurde angegeben. Weitere Informationen finden Sie in diesem Abschnitt der Seite zum Anpassen von matplotlib.

Eine vollständige Liste der rcParamsTasten können über abgerufen werden plt.rcParams.keys(), aber für die Einstellung Schriftgrößen Sie haben (kursiv von zitierte hier )

  • axes.labelsize- Schriftgröße der x- und y-Beschriftungen
  • axes.titlesize- Schriftgröße des Achsentitels
  • figure.titlesize- Größe des Figurentitels ( Figure.suptitle())
  • xtick.labelsize- Schriftgröße der Häkchen
  • ytick.labelsize- Schriftgröße der Häkchen
  • legend.fontsize- Schriftgröße für Legenden ( plt.legend(), fig.legend())
  • legend.title_fontsize- Die Schriftgröße für Legendentitel entspricht Noneden Standardachsen. In dieser Antwort finden Sie ein Verwendungsbeispiel.

Alle akzeptieren String-Größen {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}oder ein floatIn pt. Die Zeichenfolgengrößen werden relativ zur Standardschriftgröße definiert, die durch angegeben wird

  • font.size- Die Standardschriftgröße für Text in Pkt. 10 pt ist der Standardwert

Darüber hinaus kann das Gewicht von angegeben werden (allerdings nur für den Standardwert)

  • font.weight- Die Standardgewichtung der von verwendeten Schriftart text.Text. Akzeptiert {100, 200, 300, 400, 500, 600, 700, 800, 900}oder 'normal'(400), 'bold'(700) 'lighter'und 'bolder'( relativ zum aktuellen Gewicht ).
William Miller
quelle
2

Eine alternative Lösung zum Ändern der Schriftgröße besteht darin, den Abstand zu ändern. Wenn Python Ihr PNG speichert, können Sie das Layout über das sich öffnende Dialogfeld ändern. Der Abstand zwischen den Achsen und die Polsterung können zu diesem Zeitpunkt geändert werden.

Naz
quelle
2

Platz right_axvorset_ylabel()

ax.right_ax.set_ylabel('AB scale')

Chane Badr Eddine
quelle
-3

7 (beste Lösung)

 from numpy import*
 import matplotlib.pyplot as plt
 X = linspace(-pi, pi, 1000)

class Crtaj:

    def nacrtaj(self,x,y):
         self.x=x
         self.y=y
         return plt.plot (x,y,"om")

def oznaci(self):
    return plt.xlabel("x-os"), plt.ylabel("y-os"), plt.grid(b=True)

6 (etwas schlechtere Lösung)

from numpy import*
M = array([[3,2,3],[1,2,6]])
class AriSred(object):
    def __init__(self,m):
    self.m=m

def srednja(self):
    redovi = len(M)
    stupci = len (M[0])
    lista=[]
    a=0
    suma=0
    while a<stupci:
        for i in range (0,redovi):
            suma=suma+ M[i,a]
        lista.append(suma)
        a=a+1
        suma=0
    b=array(lista) 
    b=b/redovi
    return b



OBJ = AriSred(M)
sr = OBJ.srednja()
Shapeshifter123
quelle
2
Dieser Code bietet möglicherweise eine Lösung für das Problem von OP. Es wird jedoch dringend empfohlen, einen zusätzlichen Kontext anzugeben, in dem erläutert wird, warum und / oder wie dieser Code die Frage beantwortet. Nur-Code-Antworten werden auf lange Sicht normalerweise unbrauchbar, da zukünftige Betrachter mit ähnlichen Problemen die Gründe für die Lösung nicht verstehen können.
E. Zeytinci