web-dev-qa-db-ja.com

Matplotlibプロットのフォントサイズを変更する方法

Matplotlibプロット上のすべての要素(目盛り、ラベル、タイトル)のフォントサイズをどのように変更するのですか?

目盛ラベルのサイズを変更する方法を私は知っています、これはで行われます:

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

しかし、残りの部分はどう変わるのでしょうか。

383
Herman Schaaf

matplotlibのドキュメントから

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

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

これは、すべての項目のフォントをkwargsオブジェクトfontで指定されたフォントに設定します。

あるいは、 この答え で提案されているようにrcParamsupdateメソッドを使用することもできます。

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

または

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

利用可能なプロパティの完全なリストは matplotlibのカスタマイズページ にあります。

451
Herman Schaaf
matplotlib.rcParams.update({'font.size': 22})
171
Marius Retegan

すでに作成されている特定のプロットだけのフォントサイズを変更したい場合は、これを試してください。

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

私のようにあなたがコントロールフリークなら、あなたはすべてのフォントサイズを明示的に設定したいかもしれません:

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

rcmatplotlibメソッドを呼び出すサイズを設定することもできます。

import matplotlib

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

# and so on ...
157
Pedro M Duarte

更新: もう少しよいやり方は答えの下を見てください。
アップデート#2: 凡例のタイトルのフォントも変更することにしました。
更新#3: Matplotlib 2.0.0に バグがある - 対数軸の目盛ラベルがデフォルトのフォントに戻る。 2.0.1で修正されるはずですが、私は答えの第2部に回避策を含めました。

この答えは、凡例を含めてすべてのフォントを変更しようとしている人、およびそれぞれのものに異なるフォントとサイズを使用しようとしている人のためのものです。これはrcを使用しません(これは私には効果がないようです)。それはやや面倒ですが、私は個人的に他の方法で掴むことができませんでした。それは基本的にここでryggyrの答えと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()

この方法の利点は、複数のフォント辞書を用意することで、さまざまなタイトルに異なるフォント/サイズ/太さ/色を選択し、目盛ラベルにフォントを選択し、凡例にフォントを選択することができます。


更新:

フォント辞書を廃止し、システム上の任意のフォント(.otfフォントさえも)を許可する、やや異なる、雑然としたアプローチを考え出しました。それぞれに別々のフォントを使用するには、font_pathfont_propのような変数を追加してください。

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

うまくいけば、これは包括的な答えです。

56
binaryfunt

これは、フォントサイズを変更するために驚くほどうまく機能する、まったく異なるのアプローチです。

図のサイズを変更してください

私は通常このようなコードを使います:

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)

あなたが図形サイズを作る小さい、フォントの大きいプロットに対してです。これもマーカーを拡大します。注dpiまたはdot per inchも設定します。私はこれをAMTA(American Modeling Teacher of America)フォーラムの投稿から学びました。上記のコードの例: enter image description here

25
Prof Huster

plt.tick_params(labelsize=14)を使う

13

上記のものに基づいて:

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

これはMarius Retegan answer の拡張です。 rcParams.updateを使ってロードするよりも、すべての変更を加えて別のJSONファイルを作成できます。変更は現在のスクリプトにのみ適用されます。そう

import json
from matplotlib import pyplot as plt, rcParams

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

そして、この「example_file.json」を同じフォルダに保存します。

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

最も簡単な方法はFigureのサイズを変更することで、デフォルトフォントのままにすることができるという点で、Huster教授に完全に同意します。軸ラベルがカットされているので、フィギュアをpdfとして保存するときに、これをbbox_inchesオプションで補完しなければなりませんでした。

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

matplotlibplt.rcParams["font.size"]を設定するためにfont_sezeを使用することができ、またmatplotlibplt.rcParams["font.family"]を設定するためにfont_familyを使用することができます。この例を試してください:

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')
1
hamed baziyad