একটি ম্যাটপ্লোটিলিব প্লটে কীভাবে ফন্টের আকার পরিবর্তন করবেন


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)

এটি সমস্ত আইটেমের ফন্টকে কোয়ার্গস অবজেক্ট দ্বারা নির্দিষ্ট ফন্টে সেট করে font

বিকল্পভাবে, আপনি এই উত্তরেrcParams update প্রস্তাবিত পদ্ধতিটিও ব্যবহার করতে পারেন :

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

অথবা

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

আপনি কাস্টমাইজিং ম্যাটপ্ল্লিটিব পৃষ্ঠায় উপলভ্য বৈশিষ্ট্যের একটি সম্পূর্ণ তালিকা পেতে পারেন ।


2
চমৎকার, এটি ছাড়া কোনও ফন্টসাইজ সম্পত্তি ওভাররাইড ছাড়া è_é
যোটা

2
আমি কোথা থেকে মত উপাদানের জন্য আরও বিকল্প জানতে পারেন 'family', 'weight'ইত্যাদি?
হ্যাকগুলি

2
@HermanSchaaf; আমি আগে এই পৃষ্ঠাটি পরিদর্শন করেছি। আমি সমস্ত বিকল্প জানতে চাই 'family'ভালো লেগেছে 'normal', 'sans-serif'ইত্যাদি
haccks

77
যেহেতু অনেক লোক শুরু করে import matplotlib.pyplot as plt, আপনি সম্ভবত pyplotএটির উল্লেখও করতে পছন্দ করতে পারেন rc। আপনি plt.rc(...আপনার আমদানি পরিবর্তন না করেই করতে পারেন ।
লন্ডনরব

21
অধৈর্য ব্যক্তিদের জন্য: দ্বিতীয় লিঙ্কের মতো ডিফল্ট ফন্টের আকার 10 হয়।
এফভিডি

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 এর সাথে সম্মত হন, এটি সেরা উত্তর!
সেফ

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
ক্ষেত্রে যদি এই সমাধানটি কেবল তখনই কাজ করে যদি আমি প্রথম প্লট তৈরি করি, তবে প্রস্তাবিত হিসাবে "আপডেট" হবে যা নতুন পরিসংখ্যানগুলির জন্য আপডেট হওয়া ফন্টের আকারের দিকে নিয়ে যায়। হয়তো প্রথম প্লটটি আরসিপ্যারামগুলি শুরু করার জন্য প্রয়োজনীয় ...
সানজিও ২

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
আমার উদ্দেশ্যটি ছিল xy লেবেল, টিক্স এবং শিরোনামগুলি বিভিন্ন আকারের। এর একটি পরিবর্তিত সংস্করণ আমার পক্ষে এত ভাল কাজ করেছে।
আইজাক

6
কিংবদন্তিগুলি পেতে পাশাপাশি ax.legnd ()। Get_texts () ব্যবহার করুন। ম্যাটপ্ল্লিটিব ১.৪ এ পরীক্ষিত।
জেমস এস

এটি প্রশ্নের সরাসরি উত্তর দেয়। ধন্যবাদ.
jimh

ax=plt.gca()অক্ষটি সংজ্ঞায়িত না করে প্লটটি তৈরি করা হলে প্রয়োজন হতে পারে ।
ডাইলানান

@JamesS। পরিবর্তে ব্যবহার করুন ax.get_legend().get_texts(), কারণ ax.legend()এর মান ফেরত দেওয়ার উপরে ডিফল্ট পরামিতিগুলি সহ পুরো কিংবদন্তি পুনরায় আঁকুন ax.get_legend()
গুইমুট

69

আপডেট: এটি করার কিছুটা ভাল পদ্ধতির জন্য উত্তরের নীচের অংশটি দেখুন।
আপডেট # 2: আমি কিংবদন্তির শিরোনাম ফন্টগুলিও বদলাতে পেরেছি।
আপডেট # 3: ম্যাটপ্ল্লোব ২.০.০ এ একটি বাগ রয়েছে যা লোগারিদমিক অক্ষগুলির জন্য টিক লেবেলগুলিকে ডিফল্ট ফন্টে ফিরিয়ে আনছে । ২.০.১ এ স্থির করা উচিত তবে আমি উত্তরের ২ য় অংশে কাজটি অন্তর্ভুক্ত করেছি।

কিংবদন্তি সহ যে সকল ফন্ট পরিবর্তন করার চেষ্টা করছেন এবং যে কোনও একটির জন্য প্রতিটি ফন্ট এবং আকার ব্যবহার করার চেষ্টা করছেন এমন ব্যক্তির পক্ষে এই উত্তরটি। এটি আরসি ব্যবহার করে না (যা আমার পক্ষে কাজ করে না বলে মনে হয়)। এটি বরং কষ্টকর কিন্তু আমি ব্যক্তিগতভাবে অন্য কোনও পদ্ধতিতে গ্রিপ করতে পারিনি। এটি মূলত 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()

এই পদ্ধতির সুবিধাটি হ'ল, বেশ কয়েকটি ফন্ট অভিধান থাকলে আপনি বিভিন্ন শিরোনামের জন্য বিভিন্ন হরফ / আকার / ওজন / রঙ চয়ন করতে পারেন, টিক লেবেলের জন্য ফন্ট চয়ন করতে পারেন এবং সমস্ত স্বতন্ত্রভাবে কিংবদন্তির জন্য ফন্ট বেছে নিতে পারেন।


হালনাগাদ:

আমি কিছুটা আলাদা, কম বিশৃঙ্খলাযুক্ত পদ্ধতি তৈরি করেছি যা ফন্টের অভিধানগুলি সরিয়ে দেয় এবং আপনার সিস্টেমে কোনও ফন্টকে এমনকি .otf ফন্টকেও মঞ্জুরি দেয়। প্রতিটি জিনিসের জন্য পৃথক ফন্ট রাখতে, আরও বেশি 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")
পাও

আমি যদি চিত্রটি সংরক্ষণ না করছি? আমি জাইপ্টার নোটবুকে প্লট করছি এবং ফলস্বরূপ অক্ষের লেবেলগুলি কাটা যাবে।
জাইথির

ধন্যবাদ! সমস্ত লাইনের আকার, ফন্টের আকার ইত্যাদি সামঞ্জস্য না করে আমার প্লটগুলির মুদ্রণযোগ্য সংস্করণ প্রস্তুত করতে ডিপিআই সেটিংসটি নির্দেশ করা আমার পক্ষে অত্যন্ত সহায়ক ছিল me
ybull

27

ব্যবহার plt.tick_params(labelsize=14)


4
কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান, তা বর্ণনা করে এর দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতের পাঠকদের কাছে অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
sepehr

22

আপনি ব্যবহার করতে পারেন plt.rcParams["font.size"]সেট করার জন্য font_sizematplotlibএবং আপনি ব্যবহার করতে পারেন plt.rcParams["font.family"]সেট করার জন্য font_familymatplotlib। এই উদাহরণটি ব্যবহার করে দেখুন:

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

এটি মারিয়াস রেটগান উত্তরের একটি বর্ধন । আপনি আপনার সমস্ত পরিবর্তনগুলি এবং 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": ""
}

4

আমি অধ্যাপক হুষ্টারের সাথে সম্পূর্ণরূপে একমত যে এগিয়ে যাওয়ার সহজতম উপায় হ'ল চিত্রের আকার পরিবর্তন করা, এটি ডিফল্ট ফন্টগুলি রাখার অনুমতি দেয়। পিডিএফ হিসাবে চিত্রটি সংরক্ষণ করার সময় আমাকে কেবল একটি বাক্স_ইঞ্চ বিকল্পের সাথে পরিপূরক করতে হয়েছিল কারণ অক্ষরের লেবেলগুলি কেটে গেছে।

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.