pandas bilan chizish: df.plot
Sahna: jadval tayyor — rasm bitta qatorda
2-qismda deyarli har bobda .plot() ni ko'rdingiz: value_counts().plot(kind="bar"), oylik.plot(marker="o"). Bu — pandas ning Matplotlib ustidagi qulay qatlami. Ma'lumot DataFrame da tayyor bo'lsa, pandas ustun nomlarini legend ga, index ni x o'qiga o'zi qo'yadi. Bu bobda u nimalarni qila olishini va qayerda Matplotlib ga qaytish kerakligini ko'ramiz.
import numpy as np import pandas as pd savdo = pd.read_csv(DATA / "dokon_savdo.csv", parse_dates=["sana"], date_format="%d.%m.%Y") savdo["tushum"] = savdo["miqdor"] * savdo["narx"] katalog = pd.read_csv(DATA / "mahsulotlar.csv").drop_duplicates("mahsulot_id") savdo = savdo.merge(katalog[["mahsulot_id", "kategoriya"]], on="mahsulot_id", validate="many_to_one") oylik = savdo.pivot_table(index=savdo["sana"].dt.month, columns="kategoriya", values="tushum", aggfunc="sum") / 1e6 oylik.index.name = "oy" oylik.round(1).head(3)
| oy | Bakaleya | Ichimliklar | Non mahsulotlari | Sut mahsulotlari |
|---|---|---|---|---|
| 1 | 13.6 | 4.5 | 0.7 | 10.6 |
| 2 | 10.7 | 4.5 | 0.7 | 11.2 |
| 3 | 23.5 | 9.5 | 1.4 | 20.1 |
Bitta qator — bitta grafik
ax = oylik.plot(marker="o", figsize=(9, 3.4), title="Kategoriya bo'yicha oylik tushum, mln so'm") print(type(ax).__name__) plt.show()
Axes

pandas har ustunni alohida chiziq qildi, ustun nomlarini legend ga, index ni (oy) x o'qi nomiga yozdi. Va eng muhimi — Axes qaytardi. Ya'ni pandas chizgan rasmni keyin Matplotlib bilan istagancha sozlash mumkin (ax.set_ylabel, ax.axhline...).
kind: grafik turi
fig, axs = plt.subplots(2, 3, figsize=(13, 6.4), layout="constrained") yillik = oylik.sum().sort_values() oylik.plot(ax=axs[0, 0], title="line (standart)") yillik.plot(kind="barh", ax=axs[0, 1], color="#b06000", title="barh") oylik.plot(kind="area", ax=axs[0, 2], title="area (ustma-ust)", legend=False) oylik.plot(kind="box", ax=axs[1, 0], title="box", rot=20) chek = savdo.groupby("chek_id")["tushum"].sum() / 1000 chek.plot(kind="hist", bins=40, ax=axs[1, 1], color="#137333", title="hist: chek, ming so'm") oylik.plot(kind="bar", stacked=True, ax=axs[1, 2], title="bar, stacked=True", legend=False, rot=0) plt.show()

kind= — "line", "bar", "barh", "hist", "box", "area", "scatter", "pie". Har biri 18-bobdagi Matplotlib grafigining qisqa varianti.
ax= — qaysi chizmaga chizish. Shu argument bilan pandas grafiklari 19-bobdagi panjaraga joylashadi. ax= bermasangiz, pandas har safar yangi Figure yaratadi.
area va stacked=True — ustma-ust: eng yuqori chegara — jami. Tarkib (qaysi kategoriya qancha ulush) va jami bir rasmda ko'rinadi.
scatter: rang uchinchi ustun
kunlik = (savdo.groupby("sana").agg(tushum=("tushum", "sum"), cheklar=("chek_id", "nunique")) .assign(tushum=lambda d: d["tushum"] / 1e6, hafta_kuni=lambda d: d.index.dayofweek)) ax = kunlik.plot(kind="scatter", x="cheklar", y="tushum", c="hafta_kuni", cmap="viridis", figsize=(8, 3.8), title="Kunlik cheklar va tushum (rang — hafta kuni, 0 = Du)") plt.show() print("korrelyatsiya:", kunlik["cheklar"].corr(kunlik["tushum"]).round(2))
korrelyatsiya: 0.84

kind="scatter" uchun x va y ustun nomlari shart. c="hafta_kuni" — nuqta rangi uchinchi ustundan, cmap — ranglar shkalasi; o'ng tomonda shkala avtomatik chiqadi. Rasm ikki narsani aytadi: cheklar ko'p kun — tushum ko'p (aloqa kuchli), va eng o'ngdagi, sariq nuqtalar — dam olish kunlari.
Ikkita shkala: secondary_y
Tushum (mln so'm) va cheklar soni (dona) — boshqa birliklar. Bitta o'qda biri tekis chiziq bo'lib qoladi (19-bob mashqi). Yechim — ikkinchi y o'qi:
haftalik = kunlik[["tushum", "cheklar"]].resample("W").sum() ax = haftalik.plot(secondary_y="cheklar", figsize=(10, 3.4), title="Haftalik tushum va cheklar") ax.set_ylabel("tushum, mln so'm") ax.right_ax.set_ylabel("cheklar, dona") plt.show()

secondary_y="cheklar" — shu ustun o'ng o'qda, o'z shkalasida. ax.right_ax — o'ng o'qning Axes i. Ikki shkalali grafik kuchli, lekin xavfli: o'q chegaralarini o'zgartirib, ikki chiziqni xohlagancha "mos" yoki "mos emas" ko'rsatish mumkin. Ishlatsangiz — ikkala o'qni aniq nomlang.
subplots=True: har ustun alohida
axs = oylik.plot(subplots=True, layout=(2, 2), figsize=(10, 5), sharex=True, legend=False, title=list(oylik.columns), marker=".") plt.show()

subplots=True — har ustun o'z chizmasida (19-bobdagi siklsiz). layout=(2, 2) — panjara shakli. Lekin e'tibor: bu yerda sharey yo'q — har chizma o'z shkalasida. Non mahsulotlari va sut mahsulotlari chiziqlari bir xil balandlikda ko'rinadi, aslida esa ular orasida 16 barobar farq bor. Solishtirish kerak bo'lsa — sharey=True qo'shing (19-bob).
pandas yoki Matplotlib?
| Vaziyat | Nima qulay |
|---|---|
| Jadval tayyor, tez ko'rish kerak | df.plot() |
| Bir nechta ustun — legend kerak | df.plot() (o'zi qo'yadi) |
| Murakkab maket, nozik sozlash | fig, ax + Matplotlib, ichida df.plot(ax=ax) |
| Hisobot uchun yakuniy rasm | Matplotlib bilan sozlangan (21-bob) |
Eng yaxshi usul — ikkalasi birga: fig, ax = plt.subplots(), keyin df.plot(ax=ax), keyin ax.set_... bilan pardozlash.
Xulosa
df.plot()— ustunlar legend ga, index x o'qiga; Axes qaytaradi.kind=— line, bar, barh, hist, box, area, scatter;stacked=True— ustma-ust.ax=— panjaradagi aniq chizmaga.- scatter:
x,yshart;c=+cmap— rang uchinchi ustundan. secondary_y— boshqa birlikdagi ustun o'ng o'qda.subplots=True— har ustun alohida; solishtirish uchunsharey=Trueni unutmang.
Mashqlar
oyliknikind="bar"bilan, lekin har kategoriya foiz ulushida chizing (har qator yig'indisi 100).- Har filialning kunlik tushumini
boxgrafikda solishtiring (pivot_table→plot(kind="box")). kunlikscatter idac=o'rnigas=(nuqta o'lchami) bilan cheklar sonini ko'rsating. Qaysi biri o'qilishi oson?
Javoblar
oylik.div(oylik.sum(axis=1), axis=0).mul(100).plot(kind="bar", stacked=True)— 5-bobdagi ulush, pandas varianti.savdo.pivot_table(index="sana", columns="filial_id", values="tushum", aggfunc="sum").plot(kind="box").- Rang yaxshiroq: odam ko'zi nuqta o'lchamlari farqini rangdan yomonroq sezadi.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.