Sozlash: oddiy grafikdan hisobot grafigiga
Sahna: "tushunarli, lekin chiroyli emas"
Standart Matplotlib grafigi to'g'ri, lekin "xom": sarlavha umumiy, o'qdagi sonlar 1e8 kabi, ranglar tasodifiy, keraksiz ramkalar. Hisobotga qo'yiladigan grafik boshqacha bo'lishi kerak: bir qarashda asosiy xulosani aytishi. Bu bobda bitta grafikni qadam-baqadam shunday holatga keltiramiz va har qadam nima uchun kerakligini ko'ramiz.
import numpy as np import pandas as pd from matplotlib.ticker import FuncFormatter 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() oylar = ["Yan", "Fev", "Mar", "Apr", "May", "Iyn", "Iyl", "Avg", "Sen", "Okt", "Noy", "Dek"]
Boshlang'ich holat
fig, ax = plt.subplots(figsize=(9, 3.6)) ax.bar(oylik.index, oylik.values) plt.show()

Muammolar: y o'qida 1e7 — o'quvchi sonni o'zi hisoblashi kerak; x da 2, 4, 6 — oy nomlari yo'q; sarlavha yo'q; nima muhimligi aytilmagan.
1. O'q sonlarini o'qiladigan qilish
mln = FuncFormatter(lambda qiymat, _: f"{qiymat / 1e6:.0f} mln") fig, ax = plt.subplots(figsize=(9, 3.6)) ax.bar(oylar, oylik.values) ax.yaxis.set_major_formatter(mln) plt.show()

FuncFormatter — har belgi uchun matnni siz yozadigan funksiya: endi "50 mln". Oy raqamlari o'rniga nomlar — x o'qiga ro'yxat berildi.
2. Rang — urg'u uchun, bezak uchun emas
Grafikning bitta xulosasi bor: "dekabr — yilning eng yaxshi oyi". Hamma ustun bir xil rangda bo'lsa, ko'z uni o'zi qidiradi. Urg'u bitta rang bilan beriladi:
eng = oylik.idxmax() ranglar = ["#c5221f" if oy == eng else "#c4c7c5" for oy in oylik.index] fig, ax = plt.subplots(figsize=(9, 3.6)) ax.bar(oylar, oylik.values, color=ranglar) ax.yaxis.set_major_formatter(mln) plt.show()

Kulrang — "kontekst", qizil — "mana shu". Bu usulni deyarli har hisobot grafigida ishlatish mumkin.
3. Sarlavha xulosani aytadi
fig, ax = plt.subplots(figsize=(9, 3.8)) ustunlar = ax.bar(oylar, oylik.values, color=ranglar) ax.yaxis.set_major_formatter(mln) osish = (oylik[12] / oylik[11] - 1) * 100 ax.set_title(f"Dekabr — yilning eng kuchli oyi: noyabrdan {osish:.0f}% ko'p", loc="left", fontsize=12, weight="bold") ax.annotate(f"{oylik[12] / 1e6:.1f} mln", xy=(11, oylik[12]), xytext=(0, 4), textcoords="offset points", ha="center", color="#c5221f", weight="bold") plt.show()

"Oylik tushum" — mavzu. "Dekabr — eng kuchli oy, noyabrdan 38% ko'p" — xulosa. Raqam koddan hisoblandi, qo'lda yozilmadi: ma'lumot yangilansa, sarlavha ham o'zi yangilanadi. annotate — bitta muhim qiymatni ustun ustiga yozdi; offset points — ustundan 4 nuqta yuqorida.
4. Ortiqchani olib tashlash
fig, ax = plt.subplots(figsize=(9, 3.8)) ax.bar(oylar, oylik.values, color=ranglar) ax.yaxis.set_major_formatter(mln) ax.set_title(f"Dekabr — yilning eng kuchli oyi: noyabrdan {osish:.0f}% ko'p", loc="left", fontsize=12, weight="bold") ax.annotate(f"{oylik[12] / 1e6:.1f} mln", xy=(11, oylik[12]), xytext=(0, 4), textcoords="offset points", ha="center", color="#c5221f", weight="bold") ax.spines[["top", "right"]].set_visible(False) ax.grid(axis="y", alpha=0.3) ax.set_axisbelow(True) ax.tick_params(length=0) fig.text(0.01, -0.02, "Manba: do'kon tarmog'i kassa ma'lumotlari, 2025", fontsize=8, color="#5f6368") plt.show()

- Yuqori va o'ng chegara (spine) hech narsa aytmaydi — olib tashlandi.
- Gorizontal to'r — qiymatni o'qishga yordam;
alpha=0.3— xira,set_axisbelow— ustunlar orqasida. - Manba — har hisobot grafigida: o'quvchi raqam qayerdan kelganini bilishi kerak.
Endi birinchi rasm bilan solishtiring: ma'lumot bir xil, xabar esa bir qarashda o'qiladi.
Rang xaritalari: ma'lumot turi tanlaydi
Rang ikki xil vazifada ishlatiladi, va ular uchun har xil shkala kerak:
from matplotlib import colormaps fig, axs = plt.subplots(3, 1, figsize=(9, 2.6)) for ax, nom, izoh in zip(axs, ["viridis", "RdBu", "tab10"], ["ketma-ket: kam → ko'p (son, zichlik)", "ikki tomonlama: manfiy ↔ 0 ↔ musbat (o'zgarish, korrelyatsiya)", "sifat: tartibsiz guruhlar (filial, kategoriya)"]): ax.imshow(np.linspace(0, 1, 256)[None, :] if nom != "tab10" else np.arange(10)[None, :], aspect="auto", cmap=colormaps[nom]) ax.set_yticks([]) ax.set_xticks([]) ax.set_title(f"{nom} — {izoh}", loc="left", fontsize=9.5) fig.tight_layout() plt.show()

| Ma'lumot | Shkala | Misol |
|---|---|---|
| son: kam → ko'p | ketma-ket (sequential) | viridis, Blues, YlGn |
| o'rtasi ma'noli (0, o'rtacha) | ikki tomonlama (diverging) | RdBu, coolwarm + markaz |
| tartibsiz guruhlar | sifat (qualitative) | tab10, Set2 |
viridis shunchaki chiroyli emas: u rang ko'r odamlar uchun ham ajralib turadi va oq-qora bosmada ham tartibni saqlaydi. "Kamalak" (jet) shkalasidan qoching: unda yorqin sariq o'rtada turadi va ko'z u yerda mavjud bo'lmagan "chegara" ko'radi.
Uslub (style) bir qatorda
uslublar = [u for u in plt.style.available if not u.startswith("_")] print(len(uslublar), "ta tayyor uslub, masalan:", uslublar[:5]) with plt.style.context("ggplot"): fig, ax = plt.subplots(figsize=(8, 3)) ax.plot(oylar, oylik.values / 1e6, marker="o") ax.set_title("ggplot uslubida") plt.show()
25 ta tayyor uslub, masalan: ['Solarize_Light2', 'bmh', 'classic', 'dark_background', 'fast']

plt.style.context(...) — faqat with bloki ichida amal qiladi; keyingi rasmlar odatiy holatga qaytadi. plt.style.use(...) esa butun daftarga qo'llanadi. Tayyor uslub — boshlanish nuqtasi; hisobot grafigi baribir yuqoridagi to'rt qadamni talab qiladi.
Xulosa: hisobot grafigi nazorat ro'yxati
- O'qlar o'qiladi: sonlar formatlangan (
FuncFormatter), nomlar to'liq. - Rang urg'u beradi: kontekst — kulrang, asosiy — bitta yorqin rang.
- Sarlavha — xulosa, mavzu emas; raqamlar koddan.
- Muhim qiymat yozilgan (
annotate,bar_label). - Ortiqcha yo'q: keraksiz chegaralar va to'r olib tashlangan.
- Manba ko'rsatilgan.
- Bar — noldan, solishtirilayotgan chizmalar — umumiy o'qda (19-bob).
- Rang shkalasi ma'lumotga mos: ketma-ket, ikki tomonlama yoki sifat.
Mashqlar
- 18-bobdagi "to'lov turi bo'yicha tushum" grafigini nazorat ro'yxati bo'yicha qayta chizing.
- Oylik tushumni chiziqli grafikda chizing va eng past oyni ko'k, eng yuqorisini qizil nuqta bilan belgilang.
FuncFormatterbilan y o'qini "50 000 000" emas, "50 mln so'm" ko'rinishida yozing.
Javoblar
- Saralangan
barh, eng katta — bitta rangda,bar_label, sarlavhada xulosa ("naqd — eng ko'p"), chegaralarsiz. ax.scatter([eng_past_oy], [qiymat], color=...)— chiziq ustiga ikkita nuqta.FuncFormatter(lambda q, _: f"{q / 1e6:.0f} mln so'm").
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.