Matplotlib: rasmning anatomiyasi va ikki uslub
Sahna: rasm nimadan iborat
Kitob davomida 40 dan ortiq rasm chizdik va har birida fig, ax = plt.subplots() ni yozib o'tdik. Endi uning ichini ochamiz. Matplotlib — Python ning asosiy chizish kutubxonasi: pandas ning .plot() i ham, seaborn ham ichida aynan uni ishlatadi. Shuning uchun uni tushunsangiz, har qanday grafikni o'zingizga moslab sozlay olasiz.
import matplotlib import matplotlib.pyplot as plt import numpy as np import pandas as pd print(matplotlib.__version__)
3.8.4
pyplot — chizish buyruqlari to'plami, plt — umumiy qisqartma.
Anatomiya: Figure va Axes

Matplotlib rasmining qismlari: Figure, Axes, title, label, tick, legend, spine, grid
Ikki asosiy tushuncha:
- Figure (
fig) — butun rasm, "qog'oz varag'i". Uning o'lchami, fon rangi, faylga saqlash — Figure ishi. - Axes (
ax) — varaq ustidagi bitta chizma maydoni: o'qlari, chiziqlari, sarlavhasi bilan. Bitta Figure da bir nechta Axes bo'lishi mumkin (19-bob).
Nomga e'tibor bering: Axes (chizma) va Axis (bitta o'q, masalan x o'qi) — boshqa-boshqa narsa. Bitta Axes ichida ikkita Axis bor.
Qolgan hamma narsa — Axes ga tegishli bo'laklar: chiziq (Line2D), sarlavha, o'q nomlari, belgilar (tick), afsona (legend), chegara chiziqlari (spine), to'r (grid). Har birini alohida o'zgartirish mumkin — 21-bob shu haqida.
Ma'lumot: do'konning oylik tushumi
savdo = pd.read_csv(DATA / "dokon_savdo.csv", parse_dates=["sana"], date_format="%d.%m.%Y") savdo["tushum"] = savdo["miqdor"] * savdo["narx"] oylik = savdo.groupby(savdo["sana"].dt.month)["tushum"].sum() / 1e6 oylik.round(1).to_dict()
{1: 29.3, 2: 27.1, 3: 54.5, 4: 44.2, 5: 42.2, 6: 49.3, 7: 41.8, 8: 46.3, 9: 45.9, 10: 59.4, 11: 52.1, 12: 72.1}
Birinchi uslub: pyplot (plt.)
plt.plot(oylik.index, oylik.values, marker="o") plt.title("Oylik tushum") plt.xlabel("oy") plt.ylabel("mln so'm") plt.show()

Bu — pyplot uslubi: har buyruq plt. bilan, Matplotlib o'zi "joriy" (current) rasm va chizmani eslab turadi. Tez va qisqa — bitta oddiy grafik uchun yaxshi.
Ikkinchi uslub: obyektga yo'naltirilgan (fig, ax)
fig, ax = plt.subplots(figsize=(8, 3.4)) ax.plot(oylik.index, oylik.values, marker="o", color="#1a73e8") ax.set_title("Oylik tushum") ax.set_xlabel("oy") ax.set_ylabel("mln so'm") ax.set_xticks(range(1, 13)) plt.show()

plt.subplots() Figure va Axes ni yaratib, ikkalasini qaytaradi. Keyin har buyruq aniq obyektga beriladi: ax.plot, ax.set_title. Nomlar biroz boshqacha: plt.title → ax.set_title, plt.xlabel → ax.set_xlabel. Bir nechta xususiyatni bitta qatorda ham berish mumkin: ax.set(title=..., xlabel=..., ylabel=...).
Nega ikkinchisi yaxshiroq: "joriy" tuzog'i
Ikki chizmali rasmda pyplot uslubi qanday ishlashini ko'ramiz:
fig, (chap, ong) = plt.subplots(1, 2, figsize=(9, 3)) chap.plot(oylik.index, oylik.values, color="#1a73e8") ong.bar(oylik.index, oylik.values, color="#b06000") plt.title("Chap tomondagi chiziqli grafik") plt.show() print("chapning sarlavhasi:", repr(chap.get_title()), "| o'ngning sarlavhasi:", repr(ong.get_title()))
chapning sarlavhasi: '' | o'ngning sarlavhasi: 'Chap tomondagi chiziqli grafik'

Chapga mo'ljallangan sarlavha o'ngga tushdi. Sabab: plt.title "joriy" Axes ga yozadi, joriy esa — oxirgi yaratilgani, ya'ni o'ng. Kod xatosiz ishladi, natija noto'g'ri — 4-bobdagi broadcasting kabi "jim xato".
Qoida: bitta oddiy grafik — plt. mumkin; bir nechta chizma, funksiya yoki hisobot — doim fig, ax. Bu kitobning qolgan qismida faqat ikkinchi uslub.
Figure o'lchami va aniqligi
for olcham, dpi in [((4, 3), 100), ((8, 3), 100), ((8, 3), 200)]: fig = plt.figure(figsize=olcham, dpi=dpi) kenglik, balandlik = fig.get_size_inches() * fig.dpi print(f"figsize={olcham}, dpi={dpi} -> {kenglik:.0f} x {balandlik:.0f} piksel") plt.close(fig)
figsize=(4, 3), dpi=100 -> 400 x 300 piksel figsize=(8, 3), dpi=100 -> 800 x 300 piksel figsize=(8, 3), dpi=200 -> 1600 x 600 piksel
figsize=(kenglik, balandlik)— dyuymda.dpi— har dyuymda nechta piksel.- Piksel = dyuym × dpi.
Shuning uchun matnni kattaroq ko'rsatish uchun dpi ni emas, figsize ni kichraytirasiz: shrift o'lchami dyuymga bog'langan, kichik varaqda u nisbatan katta ko'rinadi.
plt.close(fig) — rasmni xotiradan o'chiradi. Siklda yuzlab rasm yasaganda buni unutmang (7-bob mashqlaridagi kabi xotira to'lib boradi).
Ikki grafik bitta Axes da
Bitta Axes ga bir nechta narsa chizish mumkin — har chaqiruv ustiga qo'shadi:
filial = savdo.pivot_table(index=savdo["sana"].dt.month, columns="filial_id", values="tushum", aggfunc="sum") / 1e6 fig, ax = plt.subplots(figsize=(8, 3.4)) ax.plot(filial.index, filial[1], marker="o", label="1-filial") ax.plot(filial.index, filial[3], marker="s", label="3-filial") ax.set(title="Ikki filial oylik tushumi", xlabel="oy", ylabel="mln so'm", xticks=range(1, 13)) ax.legend() plt.show()

label= — har chiziqning nomi; ax.legend() — ularni afsona qilib chiqaradi. Legend siz ikki chiziqli grafik — topishmoq.
Xulosa
- Figure — butun rasm, Axes — bitta chizma maydoni; Axes ichida chiziq, sarlavha, o'qlar, legend.
- pyplot uslubi (
plt.plot,plt.title) "joriy" Axes ga chizadi — bir nechta chizmada adashadi. - Obyektga yo'naltirilgan uslub:
fig, ax = plt.subplots(), keyinax.plot,ax.set_title(set_bilan). figsizedyuymda, piksel = dyuym ×dpi;plt.close(fig)— xotira uchun.- Bir Axes ga bir nechta chiziq +
label+legend.
Mashqlar
oylikni pyplot va OO uslubida chizing; ikkalasida ham x o'qi belgilarini 1 dan 12 gacha qiling.fig, ax = plt.subplots(); print(type(fig).__name__, type(ax).__name__)— nima chiqadi?- 6 × 4 dyuymli, 1200 × 800 piksel rasm uchun
dpiqancha bo'lishi kerak?
Javoblar
- pyplot:
plt.xticks(range(1, 13)); OO:ax.set_xticks(range(1, 13)). Figure Axes.- 200: 6 × 200 = 1200, 4 × 200 = 800.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.