कैसे एक matplotlib साजिश पर फ़ॉन्ट आकार बदलने के लिए


542

मैटलपोटलिब प्लॉट पर सभी तत्वों (टिक्स, लेबल, शीर्षक) के लिए फ़ॉन्ट आकार कैसे बदलता है?

मुझे पता है कि टिक लेबल के आकार को कैसे बदलना है, यह इसके साथ किया जाता है:

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

लेकिन बाकी को कैसे बदलता है?

जवाबों:


629

से matplotlib प्रलेखन ,

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

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

यह सभी वस्तुओं के फ़ॉन्ट को kwargs ऑब्जेक्ट द्वारा निर्दिष्ट फ़ॉन्ट पर सेट करता है, font

वैकल्पिक रूप से, आप इस उत्तरrcParams update में सुझाई गई विधि का भी उपयोग कर सकते हैं :

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

या

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

आप अनुकूलित करने वाले मैटप्लोटलिब पेज पर उपलब्ध संपत्तियों की पूरी सूची पा सकते हैं ।


2
अच्छा है, सिवाय इसके कि इस पर मिली किसी भी फॉन्टसाइज़ प्रॉपर्टी को ओवरराइड करें è_é
yota

2
मैं कहां से जैसे तत्वों के लिए अधिक विकल्प मिल सकता है 'family', 'weight'आदि?
haccks

2
@HermanSchaaf; मैं उस पृष्ठ पर पहले गया था। मैं के लिए सभी विकल्पों को जानना चाहते हैं 'family'की तरह 'normal', 'sans-serif'आदि
haccks

77
के बाद से कई लोगों के साथ शुरू import matplotlib.pyplot as plt, आप का कहना है कि पसंद कर सकते हैं pyplotहै rcके रूप में अच्छी तरह से। आप plt.rc(...अपने आयात को बदलने के लिए बिना कर सकते हैं ।
लंदनरोब जूल

21
अधीर के लिए: डिफ़ॉल्ट लिंक का आकार 10 है, जैसा कि दूसरे लिंक में है।
FvD

302

यदि आप मेरी तरह एक नियंत्रण फ्रीक हैं, तो आप स्पष्ट रूप से अपने सभी फ़ॉन्ट आकार निर्धारित करना चाहते हैं:

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

ध्यान दें कि आप कॉल करने वाले आकारों को भी सेट कर सकते हैं rc विधि कोmatplotlib :

import matplotlib

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

# and so on ...

9
मैंने कई उत्तरों की कोशिश की। यह सबसे अच्छा दिखता है, कम से कम जुपिटर नोटबुक में। बस उपरोक्त ब्लॉक को शीर्ष पर कॉपी करें और तीन फ़ॉन्ट आकार स्थिरांक को अनुकूलित करें।
fviktor

3
Fvitkor से सहमत हैं, यह सबसे अच्छा जवाब है!
SeF

9
मेरे लिए शीर्षक आकार काम नहीं किया। मैंने इस्तेमाल किया:plt.rc('axes', titlesize=BIGGER_SIZE)
फर्नांडो इराज़ालवल जी

1
मुझे लगता है कि आप एक ही ऑब्जेक्ट के लिए सभी सेटिंग्स को एक पंक्ति में जोड़ सकते हैं। जैसे,plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
बॉलपॉइंटबैन

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

1
इस मामले में यह समाधान केवल तभी काम करता है जब मैं पहला प्लॉट बनाता हूं, फिर सुझाव के अनुसार "अपडेट" करें, जो नए आंकड़ों के लिए अपडेट किए गए फ़ॉन्ट आकार की ओर जाता है। हो सकता है कि पहला प्लॉट rcParams को इनिशियलाइज़ करने के लिए आवश्यक हो ...
Songio

191

यदि आप केवल पहले से बनाए गए किसी विशिष्ट भूखंड के लिए फ़ॉन्ट बदलना चाहते हैं, तो यह प्रयास करें:

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
मेरा उद्देश्य एक्स लेबल, टिक और विभिन्न आकारों के होने के शीर्षक का फ़ॉन्ट होना था। इस के एक संशोधित संस्करण ने मेरे लिए बहुत अच्छा काम किया।
27बे इसाक

6
किंवदंतियों को प्राप्त करने के लिए ax.legend ()। Get_texts () का उपयोग करें। Matplotlib 1.4 पर परीक्षण किया गया।
जेम्स एस।

यह सीधे सवाल का जवाब देता है। धन्यवाद।
जिम्ह

ax=plt.gca()यदि एक अक्ष को परिभाषित किए बिना भूखंड बनाया गया था, तो आवश्यकता हो सकती है।
डिलाईनान २ d ’१

@JamesS। बल्कि उपयोग करें ax.get_legend().get_texts(), क्योंकि ax.legend()पूरे किंवदंती को डिफ़ॉल्ट मानों के साथ वापस लाया जाता है, जिसके मूल्य को वापस करने के शीर्ष पर ax.get_legend()
ग्यूमूटे

69

अपडेट: उत्तर के निचले हिस्से को थोड़ा बेहतर तरीके से करने के लिए इसे देखें।
# 2 अद्यतन करें: मुझे पता है कि किंवदंती शीर्षक फोंट बदल रहा है।
अपडेट # 3: Matplotlib 2.0.0 में एक बग है है जो डिफ़ॉल्ट फ़ॉन्ट को वापस करने के लिए लॉगरिदमिक कुल्हाड़ियों के लिए टिक लेबल का कारण बन रहा है। 2.0.1 में तय किया जाना चाहिए, लेकिन मैंने उत्तर के दूसरे भाग में वर्कअराउंड को शामिल किया है।

यह उत्तर किसी के लिए भी है, जिसमें किंवदंती सहित सभी फोंट को बदलने की कोशिश की गई है, और प्रत्येक चीज़ के लिए अलग-अलग फोंट और आकारों का उपयोग करने की कोशिश करने वाले किसी भी व्यक्ति के लिए है। यह आरसी (जो मेरे लिए काम नहीं करता है) का उपयोग नहीं करता है। यह बल्कि बोझिल है, लेकिन मैं व्यक्तिगत रूप से किसी अन्य विधि के साथ पकड़ में नहीं आ सका। यह मूल रूप से एसओ पर अन्य जवाबों के साथ यहाँ ryggyr के उत्तर को जोड़ती है।

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

इस पद्धति का लाभ यह है कि, कई फॉन्ट शब्दकोश होने से, आप विभिन्न शीर्षकों के लिए अलग-अलग फ़ॉन्ट / आकार / वजन / रंग चुन सकते हैं, टिक लेबल के लिए फ़ॉन्ट का चयन कर सकते हैं, और सभी स्वतंत्र रूप से, किंवदंती के लिए फ़ॉन्ट चुन सकते हैं।


अपडेट करें:

मैंने फॉन्ट डिक्शनरी के साथ थोड़ा अलग, कम क्लॉटेड अप्रोच काम किया है, और आपके सिस्टम पर किसी भी फॉन्ट को, यहां तक ​​कि फॉंट फॉन्ट को भी अनुमति देता है। प्रत्येक चीज़ के लिए अलग-अलग फोंट रखने के लिए, बस अधिक font_pathऔर font_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()

उम्मीद है कि यह एक व्यापक जवाब है


40

यहां एक पूरी तरह से अलग दृष्टिकोण है जो फ़ॉन्ट आकार बदलने के लिए आश्चर्यजनक रूप से अच्छी तरह से काम करता है:

आकृति का आकार बदलें !

मैं आमतौर पर इस तरह कोड का उपयोग करता हूं:

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प्रति इंच या डॉट भी सेट किया है । मुझे यह एएमटीए (अमेरिकन मॉडलिंग टीचर ऑफ अमेरिका) फोरम की पोस्टिंग से पता चला। उपरोक्त कोड से उदाहरण:यहाँ छवि विवरण दर्ज करें


7
कट-ऑफ किया जा रहा अक्ष लेबल बचने के लिए, के साथ आंकड़ा बचाने bbox_inchesतर्क fig.savefig('Basic.png', bbox_inches="tight")
पंजा

अगर मैं आंकड़ा नहीं बचा रहा हूँ तो क्या होगा? मैं ज्यूप्टर नोटबुक में साजिश रच रहा हूं और परिणामी अक्ष लेबल कट-ऑफ हो जाते हैं।
ज़्यथिर

धन्यवाद! डीपीआई सेटिंग्स को इंगित करना मेरे प्लॉट के प्रिंट करने योग्य संस्करणों को तैयार करने में मेरे लिए बहुत मददगार था, बिना सभी लाइन आकार, फ़ॉन्ट आकार आदि को समायोजित किए बिना
ybull

27

उपयोग plt.tick_params(labelsize=14)


4
कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या बहुत लंबे समय के मूल्य का वर्णन करके बताएगी कि यह समस्या का एक अच्छा समाधान क्यों है, और यह भविष्य के पाठकों को अन्य समान प्रश्नों के साथ अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
सेफर्रह

22

आप उपयोग कर सकते हैं plt.rcParams["font.size"]स्थापित करने के लिए font_sizeमें matplotlibहै और यह भी आप उपयोग कर सकते हैं plt.rcParams["font.family"]स्थापित करने के लिए font_familyमें matplotlib। इस उदाहरण का प्रयास करें:

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

यहाँ वह है जो मैं आमतौर पर Jupyter नोटबुक में उपयोग करता हूँ:

# 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

उपरोक्त सामान के आधार पर:

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

यह Marius Retegan उत्तर का विस्तार है । आप अपने सभी संशोधनों के साथ एक अलग JSON फ़ाइल बना सकते हैं और इसे rcParams.update के साथ लोड कर सकते हैं। परिवर्तन केवल वर्तमान स्क्रिप्ट पर लागू होंगे। इसलिए

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

4

मैं पूरी तरह से प्रो हस्टर से सहमत हूं कि आगे बढ़ने का सबसे सरल तरीका आंकड़ा का आकार बदलना है, जो डिफ़ॉल्ट फोंट रखने की अनुमति देता है। मुझे बस इसे एक bbox_inches विकल्प के साथ पूरक करना था जब आकृति को एक पीडीएफ के रूप में सहेजना था क्योंकि अक्ष लेबल काट दिए गए थे।

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.