Asosiy qismga o'tish

Matplotlib: rasmning anatomiyasi va ikki uslub

17-bob 7 kod bloki 1137 so'z

Bu bobdagi kod shu fayllar bilan ishlaydio'z kompyuteringizda ishga tushiring

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.

python6 qator
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

print(matplotlib.__version__)
Chiqish
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

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

python4 qator
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()
Chiqish
{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.)

python5 qator
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)

python7 qator
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:

python6 qator
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()))
Chiqish
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

python5 qator
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)
Chiqish
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:

python7 qator
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(), keyin ax.plot, ax.set_title (set_ bilan).
  • figsize dyuymda, piksel = dyuym × dpi; plt.close(fig) — xotira uchun.
  • Bir Axes ga bir nechta chiziq + label + legend.

Mashqlar

  1. oylik ni pyplot va OO uslubida chizing; ikkalasida ham x o'qi belgilarini 1 dan 12 gacha qiling.
  2. fig, ax = plt.subplots(); print(type(fig).__name__, type(ax).__name__) — nima chiqadi?
  3. 6 × 4 dyuymli, 1200 × 800 piksel rasm uchun dpi qancha bo'lishi kerak?

Javoblar

  1. pyplot: plt.xticks(range(1, 13)); OO: ax.set_xticks(range(1, 13)).
  2. Figure Axes.
  3. 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.

Telegramda yozish Narxlar