Hoe de lettergrootte op een matplotlib-plot te wijzigen

Hoe verander je de lettergrootte voor alle elementen (ticks, labels, titel) op een matplotlib-plot?

Ik weet hoe ik de maat van het vinkje moet wijzigen, dit doe ik met:

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

Maar hoe verander je de rest?


Antwoord 1, autoriteit 100%

Van de matplotlib-documentatie,

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 22}
matplotlib.rc('font', **font)

Dit stelt het lettertype van alle items in op het lettertype dat is opgegeven door het kwargs-object, font.

U kunt ook de rcParamsupdate-methode gebruiken, zoals voorgesteld in dit antwoord:

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

of

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

Je kunt een volledige lijst met beschikbare eigenschappen vinden op de Matplotlib-pagina aanpassen.


Antwoord 2, autoriteit 54%

Als je een controlefreak bent zoals ik, wil je misschien al je lettergroottes expliciet instellen:

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

Merk op dat je ook de grootte kunt instellen door de rcmethode aan te roepen op matplotlib:

import matplotlib
SMALL_SIZE = 8
matplotlib.rc('font', size=SMALL_SIZE)
matplotlib.rc('axes', titlesize=SMALL_SIZE)
# and so on ...

Antwoord 3, autoriteit 27%

Als je de lettergrootte wilt wijzigen voor alleen een specifieke plot die al is gemaakt, probeer dan dit:

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)

Antwoord 4, autoriteit 25%

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

Antwoord 5, autoriteit 9%

Update:zie onderaan het antwoord voor een iets betere manier om dit te doen.
Update #2:ik heb ontdekt dat ik ook de lettertypen van de legendatitels kan wijzigen.
Update #3:er is een bug in Matplotlib 2.0.0waardoor vinkjes voor logaritmische assen terugkeren naar het standaardlettertype. Zou opgelost moeten zijn in 2.0.1, maar ik heb de tijdelijke oplossing in het 2e deel van het antwoord opgenomen.

Dit antwoord is voor iedereen die alle lettertypen probeert te wijzigen, ook voor de legenda, en voor iedereen die voor elk ding verschillende lettertypen en groottes probeert te gebruiken. Het gebruikt geen rc (wat niet lijkt te werken voor mij). Het is nogal omslachtig, maar ik kon persoonlijk geen andere methode onder de knie krijgen. Het combineert in feite het antwoord van Ryggyr hier met andere antwoorden op 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()

Het voordeel van deze methode is dat u, door verschillende woordenboeken met lettertypen te hebben, verschillende lettertypen / maten / gewichten / kleuren voor de verschillende titels kunt kiezen, het lettertype voor de vinklabels kiest en het lettertype voor de legende kiest, alles onafhankelijk.


update:

Ik heb een enigszins andere, minder rommelige aanpak uitgewerkt die de woordenboeken van het lettertype afkomstig is en een lettertype op uw systeem mogelijk maakt, zelfs. Lettertypen. Om voor elk ding afzonderlijke lettertypen te hebben, schrijf gewoon meer font_pathen font_propzoals variabelen.

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

Hopelijk is dit een uitgebreid antwoord


Antwoord 6, Autoriteit 6%

Hier is een totaal Verschillende -benadering die verrassend goed werkt om de lettergroottes te wijzigen:

Wijzig de figuur formaat !

Ik gebruik meestal code zoals deze:

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)

De kleiner u maakt de figuurgrootte, de groter Het lettertype is ten opzichte van de plot . Dit schaalt ook de markers op. OPMERKING Ik stel ook de dpiof punt per inch in. Ik heb dit geleerd van een posting van de AMTA (American Modellering Docols of America) Forum.
Voorbeeld van bovenstaande code:


Antwoord 7, Autoriteit 5%

Gebruik plt.tick_params(labelsize=14)


Antwoord 8, Autoriteit 5%

U kunt plt.rcParams["font.size"]gebruiken voor instelling font_sizeIN matplotlibEN OOK KUNT U plt.rcParams["font.family"]VOOR INSTELLING font_familyIN matplotlib. Probeer dit voorbeeld:

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


Antwoord 9, autoriteit 3%

Dit is wat ik over het algemeen gebruik 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)

Antwoord 10

Op basis van het bovenstaande:

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)

Antwoord 11

Ik ben het volledig eens met Prof Huster dat de eenvoudigste manier om verder te gaan is om de grootte van de figuur te wijzigen, waardoor de standaardlettertypen behouden blijven. Ik moest dit gewoon aanvullen met een bbox_inches-optie bij het opslaan van de figuur als pdf omdat de aslabels waren afgesneden.

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

Antwoord 12

Dit is een uitbreiding op Marius Retegan answer. Je kunt een apart JSON-bestand maken met al je aanpassingen en dit vervolgens laden met rcParams.update. De wijzigingen zijn alleen van toepassing op het huidige script. Dus

import json
from matplotlib import pyplot as plt, rcParams
s = json.load(open("example_file.json")
rcParams.update(s)

en sla dit ‘example_file.json’ op in dezelfde map.

{
  "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": ""
}

Antwoord 13

De wijzigingen aan de rcParamszijn zeer gedetailleerd, meestal is het enige dat u wilt alleen het schalen van alle lettergroottes, zodat ze beter zichtbaar zijn in uw figuur. De figuurgrootte is een goede truc, maar dan moet je hem voor al je figuren dragen. Een andere manier (niet puur matplotlib, of misschien overkill als je geen seaborn gebruikt) is om de lettertypeschaal in te stellen met seaborn:

sns.set_context('paper', font_scale=1.4)

DISCLAIMER: ik weet het, als je alleen matplotlib gebruikt, dan wil je waarschijnlijk niet een hele module installeren om je plots te schalen (ik bedoel waarom niet) of als je seaborn gebruikt, dan heb je meer controle over de opties . Maar er is een geval waarin u de seaborn in uw virtuele data science-omgeving hebt, maar deze niet in deze notebook gebruikt. Hoe dan ook, nog een andere oplossing.

Other episodes