Asosiy qismga o'tish

Sozlash: oddiy grafikdan hisobot grafigiga

21-bob 8 kod bloki 1366 so'z

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

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.

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

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

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

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

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

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

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

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

  1. O'qlar o'qiladi: sonlar formatlangan (FuncFormatter), nomlar to'liq.
  2. Rang urg'u beradi: kontekst — kulrang, asosiy — bitta yorqin rang.
  3. Sarlavha — xulosa, mavzu emas; raqamlar koddan.
  4. Muhim qiymat yozilgan (annotate, bar_label).
  5. Ortiqcha yo'q: keraksiz chegaralar va to'r olib tashlangan.
  6. Manba ko'rsatilgan.
  7. Bar — noldan, solishtirilayotgan chizmalar — umumiy o'qda (19-bob).
  8. Rang shkalasi ma'lumotga mos: ketma-ket, ikki tomonlama yoki sifat.

Mashqlar

  1. 18-bobdagi "to'lov turi bo'yicha tushum" grafigini nazorat ro'yxati bo'yicha qayta chizing.
  2. Oylik tushumni chiziqli grafikda chizing va eng past oyni ko'k, eng yuqorisini qizil nuqta bilan belgilang.
  3. FuncFormatter bilan y o'qini "50 000 000" emas, "50 mln so'm" ko'rinishida yozing.

Javoblar

  1. Saralangan barh, eng katta — bitta rangda, bar_label, sarlavhada xulosa ("naqd — eng ko'p"), chegaralarsiz.
  2. ax.scatter([eng_past_oy], [qiymat], color=...) — chiziq ustiga ikkita nuqta.
  3. 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.

Telegramda yozish Narxlar