Bir matplotlib grafiğinde yazı tipi boyutu nasıl değiştirilir


542

Bir matplotlib grafiğindeki tüm öğelerin (keneler, etiketler, başlık) yazı tipi boyutunu nasıl değiştirir?

Kene etiket boyutlarını nasıl değiştireceğini biliyorum, bu ile yapılır:

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

Ama geri kalanını nasıl değiştirir?

Yanıtlar:


629

Gönderen matplotlib belgelerinde ,

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

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

Bu, tüm öğelerin yazı tipini kwargs nesnesi tarafından belirtilen yazı tipine ayarlar font.

Alternatif olarak, bu cevaptarcParams update önerildiği gibi yöntemi de kullanabilirsiniz :

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

veya

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

Matplotlib'i özelleştirme sayfasında kullanılabilir özelliklerin tam listesini bulabilirsiniz .


2
güzel, ancak yolda bulunan herhangi bir yazı tipi özelliğini geçersiz kılar è_é
yota

2
Nerede gibi elemanlar için daha fazla seçenek bulabilirsiniz 'family', 'weight'vs.?
haccks

2
@HermanSchaaf; Daha önce o sayfayı ziyaret ettim. Ben tüm seçenekleri öğrenmek istiyorum 'family'beğendiniz 'normal', 'sans-serif'vb
haccks

77
Birçok insan başladığından beri , bunun da import matplotlib.pyplot as pltolduğunu belirtmek isteyebilirsiniz . İçe aktarma işlemlerinizi değiştirmek zorunda kalmadan yapabilirsiniz . pyplotrcplt.rc(...
LondonRob

21
Sabırsız için: Varsayılan yazı tipi boyutu, ikinci bağlantıdaki gibi 10'dur.
FvD

304

Benim gibi bir kontrol ucubeseniz, tüm yazı tipi boyutlarınızı açıkça ayarlamak isteyebilirsiniz:

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

rcYöntemi çağıran boyutları da ayarlayabileceğinizi unutmayın matplotlib:

import matplotlib

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

# and so on ...

9
Cevapların çoğunu denedim. Bu, en azından Jupyter dizüstü bilgisayarlarda en iyi görünüyor. Yukarıdaki bloğu en üste kopyalayın ve üç yazı tipi boyutu sabitini özelleştirin.
fviktor

3
Fvitkor ile aynı fikirde, en iyi cevap bu!
SeF

9
Benim için başlık boyutu işe yaramadı. Ben kullandım:plt.rc('axes', titlesize=BIGGER_SIZE)
Fernando Irarrázaval G

1
Aynı nesne için tüm ayarları tek bir satırda birleştirebileceğinizi düşünüyorum. Örn,plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
BallpointBen

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

1
Bu durumda, yalnızca ilk çizim oluşturduğumda, daha sonra önerildiği gibi "güncelleme" yapıldığında bu çözüm işe yarayabilir ve bu da yeni şekiller için güncellenmiş yazı tipi boyutuna yol açar. Belki ilk arsa rcParams'ı başlatmak için gereklidir ...
Songio

191

Yalnızca önceden oluşturulmuş belirli bir grafik için yazı tipini değiştirmek istiyorsanız şunu deneyin:

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)

1
Amacım xy etiketlerinin, kenelerin ve başlıkların yazı tipinin farklı boyutlarda olmasını sağlamaktı. Bunun değiştirilmiş bir versiyonu benim için çok iyi çalıştı.
Ébe Isaac

6
Efsaneleri de almak için ax.legend (). Get_texts () kullanın. Matplotlib 1.4 üzerinde test edilmiştir.
James S.

Bu, soruyu en doğrudan cevaplar. Teşekkür ederim.
jimh

ax=plt.gca()Bir eksen tanımlanmadan grafik oluşturulmuşsa, bir öğeye ihtiyaç duyulabilir .
dylnan

@JamesS. Bunun yerine kullanımı ax.get_legend().get_texts(), çünkü ax.legend()değerinin döndürülmesinin üstündeki tüm göstergeleri varsayılan parametrelerle yeniden çizer ax.get_legend().
Guimoute

69

Güncelleme: Cevabı daha iyi yapmanın bir yolu için cevabın alt kısmına bakınız.
Güncelleme # 2: Efsane başlık yazı tiplerini de değiştirdim.
Güncelleme # 3: Matplotlib 2.0.0'da , logaritmik eksenlerin onay etiketlerinin varsayılan yazı tipine dönmesine neden olan bir hata var. 2.0.1'de düzeltilmelidir, ancak çözümün 2. bölümüne geçici çözümü ekledim.

Bu yanıt, açıklama dahil olmak üzere tüm yazı tiplerini değiştirmeye çalışan herkes ve her şey için farklı yazı tipleri ve boyutları kullanmaya çalışan herkes içindir. (Benim için işe yaramaz gibi görünüyor) rc kullanmaz. Oldukça hantal ama kişisel olarak başka bir yöntemle kavrayamadım. Temel olarak burada ryggyr'ın cevabını SO'daki diğer cevaplarla birleştirir.

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

Bu yöntemin yararı, çeşitli yazı tipi sözlüklerine sahip olarak, çeşitli başlıklar için farklı yazı tipleri / boyutları / ağırlıkları / renkleri seçebilmeniz, onay etiketleri için yazı tipini seçebilmeniz ve efsane için yazı tipini bağımsız olarak seçebilmenizdir.


GÜNCELLEME:

Yazı tipi sözlüklerini ortadan kaldıran ve sisteminizdeki herhangi bir yazı tipine, hatta .otf yazı tiplerine izin veren biraz farklı, daha az karmaşık bir yaklaşım geliştirdim. Her şey için ayrı yazı tiplerine sahip olmak için daha fazla font_pathve font_propbenzer değişkenler yazmanız yeterlidir .

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

Umarım bu kapsamlı bir cevaptır


40

İşte yazı tipi boyutlarını değiştirmek için şaşırtıcı derecede iyi çalışan tamamen farklı bir yaklaşım:

Şekil boyutunu değiştirin !

Genellikle böyle bir kod kullanın:

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)

Daha küçük Eğer rakam boyutu, yapmak büyük font arsa göre . Bu, işaretleyicileri de yükseltir. Not Ayrıca dpiinç başına veya noktasını ayarladım . Bunu AMTA (Amerika Amerikan Modelleme Öğretmeni) forumunu göndererek öğrendim. Yukarıdaki koddan örnek:resim açıklamasını buraya girin


7
Eksen etiketinin kesilmesini önlemek için, şu bbox_inchesargümanı kullanarak rakamı kaydedinfig.savefig('Basic.png', bbox_inches="tight")
Paw

Rakamı KAYDEDEMEMSEN ne olur? Juypter Notebook'da çizim yapıyorum ve ortaya çıkan eksen etiketleri kesiliyor.
Zythyr

Teşekkürler! Dpi ayarlarını işaret etmek, tüm satır boyutlarını, yazı tipi boyutlarını vb. Ayarlamak zorunda kalmadan arazilerimin yazdırılabilir sürümlerini hazırlarken bana çok yardımcı oldu.
ybull

27

kullanım plt.tick_params(labelsize=14)


4
Sınırlı ve anında yardım sağlayabilecek kod snippet'i için teşekkür ederiz. Düzgün bir açıklama, bunun neden problem için iyi bir çözüm olduğunu açıklayarak uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer soruları olan gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin.
sepehr

22

Sen kullanabilirsiniz plt.rcParams["font.size"]ayarlamak için font_sizede matplotlibayrıca kullanabileceğiniz plt.rcParams["font.family"]ayarlamak için font_familyde matplotlib. Bu örneği deneyin:

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

10

Genel olarak Jupyter Notebook'da kullandığım şey:

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

8

Yukarıdaki şeylere dayanarak:

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

Bu Marius Retegan cevabının bir uzantısıdır . Tüm değişikliklerinizle ayrı bir JSON dosyası oluşturabilir ve daha sonra rcParams.update ile yükleyebilirsiniz. Değişiklikler yalnızca geçerli komut dosyasına uygulanır. Yani

import json
from matplotlib import pyplot as plt, rcParams

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

ve bu 'example_file.json' dosyasını aynı klasöre kaydedin.

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

4

Prof Huster'a devam etmenin en basit yolunun, varsayılan yazı tiplerini korumayı sağlayan şeklin boyutunu değiştirmek olduğuna tamamen katılıyorum. Eksen etiketleri kesildi çünkü şekil pdf olarak kaydederken sadece bbox_inches seçeneği ile bunu tamamlamak zorunda kaldı.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.