Asosiy qismga o'tish

Styling, palette, saqlash

21-bob 33 kod bloki 8219 so'z

Shu bobgacha asosiy maqsad to'g'rilik edi: savolga mos plot ni tanlash, kerakli variable larni kerakli channel larga map qilish. Bu bob esa oxirgi bosqich haqida — figure ni siz emas, boshqa odam ham o'qiy oladigan qilish haqida: auditoriyaning eng orqa qatoridan projector orqali qaraganda ham, oq-qora printer da chop etilgan handout da ham, telefonda ochiladigan report ichida ham.

Seaborn ning default ko'rinishi ataylab yaxshi tanlangan, lekin bu default lar faqat bitta vaziyat uchun sozlangan: Jupyter notebook da laptop ekraniga yaqin o'tirgan odam uchun. Slide — notebook emas. Chop etilgan sahifa — slide emas. Bu bobdagi deyarli hamma narsa figure ni notebook default idan olib, u haqiqatda yashashi kerak bo'lgan medium ga ko'chirish haqida.

Bu yerda beshta alohida lever bor va ularni ongda alohida ushlab turish foydali, chunki har biri boshqa-boshqa function orqali boshqariladi:

Lever Nimani boshqaradi Qaysi vosita bilan
Style Fon rangi, grid chiziqlari, axis spine lari sns.set_theme(style=...), sns.axes_style(), sns.despine()
Context Font o'lchamlari, chiziq qalinligi, marker o'lchamlari sns.set_theme(context=...), font_scale=
Palette Qaysi rang qaysi qiymatni kodlashi palette=, sns.set_palette(), sns.color_palette()
Size Canvas ning fizik eni va bo'yi plt.figure(figsize=) yoki height=/aspect=
Output Fayl format i, resolution, kesish plt.savefig() / g.savefig()

Bu bobdagi hamma narsa odatdagi import lar va ikkita o'quv dataset idan birini nazarda tutadi:

python6 qator
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

tips = sns.load_dataset("tips")
penguins = sns.load_dataset("penguins")

21.1 set_theme() va beshta style

sns.set_theme() — seaborn ning tashqi ko'rinishiga yagona kirish nuqtasi. Argumentsiz chaqirilganda u seaborn ning tanlangan default larini matplotlib ning global sozlamalariga qo'llaydi: kulrang grid li fon, deep palette, notebook o'lchamidagi font lar.

python6 qator
import seaborn as sns
# keyin chiziladigan hamma narsaga seaborn default larini qo'llash
sns.set_theme()

# yoki to'rtta knob ni bir vaqtda sozlash
sns.set_theme(style="whitegrid", context="talk", palette="colorblind", font_scale=1.1)

Beshta style. whitegrid va darkgrid o‘quvchiga o‘qlardan qiymat o‘qishga yordam beradi; white va ticks esa grid ortiqcha bo‘ladigan nashr grafiklariga mos keladi.

📌 `set()` va `set_theme()`

sns.set() — eski nom, u hali ham ishlaydi, lekin bu orqaga moslik uchun saqlangan deprecated alias. v0.11 dan boshlab hujjatlashtirilgan function sns.set_theme(). O'qitishda ham, yozishda ham set_theme() ni ishlating; eski Stack Overflow javoblarida uchraganda set() nimaligini tanib oling.

Beshta style

Style — bu fon/grid/spine sozlamalarining to'plami. Seaborn da aniq beshta style bor va ular ikkita mustaqil ikkilik tanlov (dark yoki white fon, grid bor yoki yo'q) hamda bitta qo'shimchadan iborat:

Style Qanday ko'rinadi Qachon ishlatiladi
darkgrid Och kulrang panel (#EAEAF2), oq grid chiziqlari, spine yo'q. Default shu. Notebook dagi izlanish ishi uchun. Grid qiymatlarni o'qishga yordam beradi; kulrang fon esa ekrandagi eng yorqin narsa ma'lumot bo'lib qolishini ta'minlaydi.
whitegrid Oq panel, och kulrang grid chiziqlari, kuchsiz spine lar. Chop etiladigan handout va maqolalar uchun. Kulrang panel toner ni behuda sarflaydi va arzon printer larda yo'l-yo'l bo'lib chiqishi mumkin. Handout uchun eng yaxshi universal tanlov.
dark Kulrang panel, grid yo'q. Grid zich ma'lumot bilan raqobatlashganda — heatmap, rasm, 2-D density plot lar uchun.
white Oq panel, grid yo'q, to'rt tomondan spine lar. Aniq qiymatlar muhim bo'lmagan minimal figure lar uchun, yoki o'zingiz reference chiziqlarini chizmoqchi bo'lganingizda.
ticks white ga o'xshaydi, ustiga axis larda tashqariga qaragan kichik tick belgilari qo'shiladi. Jurnal uslubidagi figure lar uchun. Tick lar to'liq grid siz ham ko'zga tayanch beradi. Odatda sns.despine() bilan birga ishlatiladi.
🧩 Grid chiziqlari — bu chizg'ich

O'quvchi chart dan raqam o'qishi kerakmi yoki faqat shakl ni ko'rishi kerakmi — shuni so'rang. Agar u "bu bar taxminan 25" desa, unga chizg'ich kerak — grid li style ishlating. Agar u "trend o'sib boryapti" desa, chizg'ich ortiqcha shovqin — white yoki ticks ni tanlang.

Context manager bilan vaqtinchalik style

sns.axes_style() style dictionary sini qaytaradi va uni with block sifatida ishlatish mumkin — shunda faqat shu block ichida yaratilgan plot larga ta'sir qiladi. Notebook ning qolgan qismini buzmasdan bitta istisno qilishning eng toza yo'li shu.

python9 qator
sns.set_theme(style="darkgrid")

with sns.axes_style("white"):
    # faqat shu figure oq, grid siz panel da chiziladi
    sns.scatterplot(data=penguins, x="bill_length_mm", y="bill_depth_mm")
    plt.show()

# avtomatik ravishda darkgrid ga qaytadi
sns.histplot(data=penguins, x="body_mass_g")

Xuddi shu pattern context uchun ham ishlaydi: with sns.plotting_context("talk"):.

despine()

Spine lar — plot maydonini ramkaga oladigan qora chiziqlar. Yuqori va o'ng spine hech qanday ma'lumot tashimaydi — ularga nisbatan hech narsa chizilmaydi — shuning uchun ularni olib tashlash vizual shovqinni kamaytiradi. sns.despine() shuni qiladi va u plot chizilgandan keyin chaqirilishi shart.

python6 qator
sns.set_theme(style="ticks")
sns.boxplot(data=tips, x="day", y="total_bill")

sns.despine()                          # yuqori va o'ngni olib tashlaydi (default)
sns.despine(left=True)                 # chap spine ni ham olib tashlaydi (whitegrid bilan chiroyli)
sns.despine(offset=10, trim=True)      # spine larni ma'lumotdan uzoqlashtiradi, ma'lumot oralig'iga qirqadi

offset=10 axis larni ma'lumotdan 10 punkt uzoqlashtiradi — bu ilmiy nashrlarda keng tarqalgan ko'rinish. trim=True har bir spine ni qisqartirib, u faqat eng chekka tick lar orasini qamrab olishini ta'minlaydi. Figure-level plot uchun FacetGrid ni uzating: g.despine(left=True) yoki sns.despine(fig=g.figure).

Reset qilish

python6 qator
# seaborn styling ini tashlab, sof matplotlib default lariga qaytish
import matplotlib as mpl
mpl.rcParams.update(mpl.rcParamsDefault)

# yoki shunchaki seaborn ning o'z default larini qayta qo'llash
sns.set_theme()

21.2 Context: slide va chop etish uchun masshtablash

Context — seaborn dagi eng kam ishlatiladigan, lekin ma'ruzani eng ko'p yaxshilaydigan imkoniyat. U matn o'lchamlari, chiziq qalinligi, marker o'lchamlari va tick uzunliklari ni masshtablaydi — ya'ni o'qilishi ko'rish masofasiga bog'liq bo'lgan elementlarni. U figure ning eni va bo'yini o'zgartirmaydi.

QOIDAContext figure ichidagi narsalar qanchalik katta ko'rinishini o'zgartiradi. figsize esa figure ning o'zi qanchalik katta bo'lishini o'zgartiradi. Context ni o'zgartirish canvas o'lchamini o'zgartirmaydi, canvas ni kattalashtirish esa font o'lchamlarini o'zgartirmaydi.
Context Scale factor Asosiy font o'lchami Nima uchun mo'ljallangan
paper 0.8 ~9.6 pt Yozma report yoki maqoladagi kichik ko'p panelli figure lar, ya'ni figure sahifaning yarim enida chop etilganda.
notebook 1.0 (default) 12 pt Jupyter da ishlash, ekranga 50 sm masofadan qarash.
talk 1.5 18 pt Projector ga uzatiladigan slide lar. Ma'ruzalar uchun aynan shu kerak.
poster 2.0 24 pt Konferensiya poster lari, yoki katta zalning orqasidan o'qiladigan bitta juda katta chart li slide.
python10 qator
sns.set_theme(context="talk", style="whitegrid")

# context ustiga aniq sozlash: yana 15% kattaroq
sns.set_theme(context="talk", font_scale=1.15)

# faqat context, style va palette ga tegmasdan
sns.set_context("poster")

# context o'rnatgan ayrim rcParams larni bekor qilish
sns.set_context("talk", rc={"lines.linewidth": 3.0})

Context kanvasni emas, siyoh ni masshtablaydi. Proyektordagi slaydlar uchun "talk" yoki "poster" ishlating — standart "notebook" matni sinfning orqa qatoridan o‘qib bo‘lmaydi.

💡 Slide sinovi

Figure ni export qiling, keyin uni ekranda taxminan enining chorak qismigacha kichraytiring va ikki metr orqaga chekining. Agar axis label larini o'qiy olmasangiz, figure o'lchamini emas, context ni oshiring. notebook context idagi figure ni kattalashtirish faqat kichik matnning kattaroq rasmini beradi, chunki chart ga nisbatan hamma narsa birga masshtablanadi.

⚠️ Context chizish paytida qo'llanadi

set_theme() va set_context() global matplotlib holatini o'zgartiradi va bu holat figure yaratilayotgan paytda o'qiladi. Figure ni qurib bo'lganingizdan keyin context ni o'rnatish unga hech qanday ta'sir qilmaydi. Theme ni notebook ning birinchi cell ida, har qanday plot dan oldin o'rnating.

21.3 Palette ning uch turi

Bu — bobning eng muhim bo'limi. Colour palette bezak emas — u encoding. Palette ning tuzilishi ma'lumot tuzilishiga mos kelishi shart; mos kelmasa, o'quvchi ma'lumot tasdiqlamaydigan xulosalarga keladi.

ASOSIY QOIDATartibsiz kategoriyalar → qualitative. Pastdan yuqoriga o'sadigan miqdor → sequential. Ma'noli o'rta nuqtaga ega miqdor → diverging.

1. Qualitative — tartibsiz kategoriyalar uchun

Ranglar hue bo'yicha farq qiladi, lekin lightness va saturation jihatidan taxminan teng, shuning uchun birorta kategoriya boshqasidan "kattaroq" yoki "muhimroq" ko'rinmaydi. Species, hafta kuni, jins, bo'lim, mamlakat kabilar uchun ishlating.

Palette Xarakteri Birinchi uchta rang
deep Seaborn ning default i. O'rtacha saturation, ham och, ham to'q panel larda yaxshi ishlaydi. #4C72B0 ko'k, #DD8452 to'q sariq, #55A868 yashil
muted deep dan biroz yumshoqroq; ko'p element to'ldirilgan maydon bo'lganda qulay. #4878D0, #EE854A, #6ACC64
colorblind Qizil-yashil colour-vision deficiency ni hisobga olib tanlangan. O'qitishda buni default qilib oling. #0173B2, #DE8F05, #029E73
pastel Juda och. To'q matn yoki marker lar ortidagi katta to'ldirilgan maydonlar uchun yaxshi. #A1C9F4, #FFB482, #8DE5A1
bright / dark Bir xil hue ketma-ketligining yuqori va past lightness variantlari. —
Set2, Set1, Dark2, tab10 ColorBrewer va matplotlib oilalari, nomi bo'yicha mavjud. Set2: #66C2A5, #FC8D62, #8DA0CB
python2 qator
sns.scatterplot(data=penguins, x="bill_length_mm", y="flipper_length_mm",
                hue="species", palette="colorblind")

Yomon grafiklarning ko‘pini oldini oladigan qoida. Tartibsiz kategoriyalar uchun qualitative, miqdor uchun sequential, nol kabi ma’noli o‘rta nuqta bo‘lganda esa diverging.

⚠️ Qualitative palette lar tugab qoladi

Ko'pchilik qualitative palette larda bir-biridan ajratib bo'ladigan 6–10 ta rang bor. 20 ta so'rasangiz, hech kim farqlay olmaydigan 20 ta rang olasiz. Agar categorical variable da 8 tadan ko'p daraja bo'lsa, buni rang bilan hal qilmang — kichik darajalarni "Other" ga birlashtiring, facet qiling, yoki hue o'rniga pozitsiyadan foydalaning (tartiblangan bar chart).

2. Sequential — pastdan yuqoriga o'sadigan miqdor uchun

Lightness bir uchdan ikkinchi uchgacha monoton o'zgaradi, shuning uchun "to'qroq" (yoki "yorqinroq") ishonchli tarzda "ko'proq" degan ma'noni beradi. Count, density, kattalik, aholi soni, narx — har qanday manfiy bo'lmagan o'lchov uchun ishlating.

Palette Qayerdan → qayerga Izohlar
viridis to'q siyohrang #440154 → sariq #FDE725 Perceptually uniform, colour-blind uchun xavfsiz, greyscale da ham ishlaydi. Xavfsiz default.
rocket deyarli qora → to'q sariq → och krem Seaborn ning o'z palette i; och fondagi heatmap lar uchun mo'ljallangan.
mako deyarli qora → moviy-yashil → och yashil rocket ning sovuq ohangdagi juftligi.
flare och to'q sariq → to'q qizil-siyohrang Lightness diapazoni rocket nikidan torroq; chekka qiymatlar fon ichida yo'qolmasligi kerak bo'lgan line/point hue uchun yaxshiroq.
crest och yashil-ko'k → to'q ko'k flare ning sovuq muqobili; scatter/line plot lardagi hue uchun yaxshi.
Blues, Greens, Oranges, Greys oq → to'yingan hue Bitta hue li ColorBrewer ramp lari. Chop etish arzon; Greys nusxa ko'chirishdan ham eson-omon o'tadi.
cubehelix to'q → och, hue aylanib boradi Sof greyscale da ham lightness monoton bo'lishi kafolatlangan.
python5 qator
sns.scatterplot(data=penguins, x="bill_length_mm", y="bill_depth_mm",
                hue="body_mass_g", palette="viridis")

# har qanday sequential palette ni _r qo'shib teskari qilish mumkin
sns.heatmap(matrix, cmap="rocket_r")
  1. Diverging — ma'noli o'rta nuqtaga ega ma'lumot uchun

Neytral och (yoki to'q) markazda birlashgan ikkita sequential ramp. Nol — yoki o'rtacha qiymat, yoki baseline — haqiqiy, izohlanadigan chegara bo'lganda ishlating: correlation lar, foyda va zarar, o'tgan yilga nisbatan o'zgarish, residual lar, z-score lar, foiz punktidagi siljishlar.

Palette Past → o'rta → yuqori Izohlar
coolwarm #3B4CC0 ko'k → och kulrang → #B40426 qizil Klassik. Kontrasti yuqori, chop etilganda yaxshi chiqadi.
vlag ko'k → deyarli oq → qizil Seaborn ning o'z palette i; coolwarm dan yumshoqroq, slide larda ko'zni qamashtirmaydi.
icefire moviy → deyarli qora → to'q sariq Markazi to'q. To'q fon larda yaxshi; chop etish uchun g'ayrioddiy.
RdBu_r ko'k → oq → qizil ColorBrewer. _r muhim: oddiy RdBu qizilni past uchga qo'yadi va bu odatdagi o'qishni teskari qiladi.
Spectral, BrBG, PiYG turlicha BrBG (jigarrang/ko'k-yashil) qizil-yashil uchun xavfsiz yaxshi muqobil.
⚠️ `center=0` siz diverging palette — bu yolg'on

Agar colour scale ma'noli o'rta nuqtaga markazlashtirilmagan bo'lsa, neytral rang qandaydir tasodifiy qiymatga tushadi va o'quvchilar biroz musbat bo'lgan katak larni "manfiy" deb talqin qiladi, chunki ular ko'k ko'rinadi. Har doim center=0 ni uzating (yoki markazga nisbatan simmetrik vmin/vmax bering).

python4 qator
corr = penguins.corr(numeric_only=True)

sns.heatmap(corr, cmap="vlag", center=0, vmin=-1, vmax=1,
            annot=True, fmt=".2f", square=True, linewidths=.5)

Nomuvofiqlik nega chalg'itadi

Yomon seaborn figure larining ko'pchiligi ikkita xatoga borib taqaladi:

  • Tartiblangan ma'lumotga qualitative palette. Daromad decile larini Set2 bilan chizsangiz, o'quvchi o'nta bir-biriga aloqasiz hue oladi. 9-decile 3-decile dan "ko'proq" ekanini ko'rishning imkoni yo'q — ma'lumotdagi tartib encoding tomonidan yo'q qilinadi, ko'z esa hue o'xshashligidan mavjud bo'lmagan guruhlarni o'ylab topadi.
  • Tartibsiz kategoriyalarga sequential palette. Uchta penguin species ni viridis bilan bo'yasangiz, Gentoo (yorqin sariq) shkalaning eng chekka uchidek, Adelie (to'q siyohrang) esa past uchidek ko'rinadi. O'quvchilar ma'nosiz reyting borligini xulosa qiladi. Bundan tashqari to'q kategoriyani jismonan ko'rish qiyinlashadi.
🧩 Harorat murvati

Sequential — bu yorug'likni sozlovchi dimmer: bitta yo'nalish, ko'proq yoki kamroq. Diverging — bu termostat: qulay o'rta, bir tomonda issiq, ikkinchi tomonda sovuq. Qualitative — bu rangli papka yorliqlari to'plami: bir-biridan farq qiladi, lekin birortasi ikkinchisidan "yuqori" emas. Variable ga mos keladigan buyumni tanlang.

21.4 Palette tanlash va yasash

sns.color_palette() — universal constructor. U RGB tuple lar ro'yxatini qaytaradi va uni palette kutilayotgan har qanday joyga uzatish mumkin; Jupyter da esa rang namunalari ko'rinishida chiziladi.

python5 qator
sns.color_palette()                       # joriy default, 10 ta rang
sns.color_palette("Set2")                 # nomlangan qualitative
sns.color_palette("viridis", 8)           # ramp dan teng oraliqli 8 ta namuna
sns.color_palette("husl", 12)             # teng oraliqli, teng luminance li 12 ta hue
sns.color_palette("viridis", as_cmap=True)# uzluksiz colormap obyekti, heatmap/kdeplot uchun
📌 Diskret ro'yxat va uzluksiz colormap

Belgilangan kategoriyalar to'plamini bo'yaydigan function lar (barplot, boxplot, categorical hue) ranglar ro'yxati ni kutadi. Uzluksiz sonni rangga map qiladigan function lar (heatmap, kdeplot to'ldirishlari, sonli hue) esa colormap ni kutadi. as_cmap=True ikkinchi turini beradi. Noto'g'ri turni uzatish — "nega mening palette argumentim e'tiborga olinmayapti" degan savolning keng tarqalgan sababi.

Palette ni ko'rib chiqish

python6 qator
sns.palplot(sns.color_palette("flare", 6))   # rang namunalarini figure sifatida chizadi
plt.show()

# hex kod larini olish, masalan slide yoki CSS da qayta ishlatish uchun
sns.color_palette("colorblind", 6).as_hex()
# ['#0173b2', '#de8f05', '#029e73', '#d55e00', '#cc78bc', '#ca9161']

O'zingizniki yasash

python13 qator
# oqdan bitta rangga boradigan sequential ramp
sns.light_palette("#4C72B0", n_colors=6)
sns.light_palette("seagreen", as_cmap=True)

# qoradan bitta rangga boradigan sequential ramp
sns.dark_palette("#DD8452", n_colors=6, reverse=True)

# diverging: hue burchaklari (0-360) bilan berilgan ikki hue, och markazda uchrashadi
sns.diverging_palette(240, 10, s=80, l=55, n=9)   # ko'k -> och -> qizil
sns.diverging_palette(145, 300, as_cmap=True)     # yashil -> och -> siyohrang

# cubehelix: monoton lightness, greyscale da xavfsiz
sns.cubehelix_palette(start=.5, rot=-.75, as_cmap=True)

Brend ranglari va aniq map qilish

Muassasa ranglari uchun oddiy hex string lar ro'yxatini uzating. Taqdimotdagi har bir figure da ma'lum kategoriya doim bir xil rang olishini kafolatlash uchun ro'yxat o'rniga dictionary uzating — turli figure lar kategoriyalarning turli qism to'plamlarini o'z ichiga olganda bu juda muhim.

python8 qator
UNI = ["#003366", "#C8102E", "#F2A900", "#4C8C2B"]
sns.barplot(data=tips, x="day", y="total_bill", hue="day",
            palette=UNI, legend=False)

# qat'iy map: qism to'plamda biri yo'q bo'lsa ham species o'z rangini saqlaydi
species_colors = {"Adelie": "#0173B2", "Chinstrap": "#DE8F05", "Gentoo": "#029E73"}
sns.scatterplot(data=penguins, x="bill_length_mm", y="flipper_length_mm",
                hue="species", palette=species_colors)

Global default o'rnatish

python7 qator
sns.set_palette("colorblind")            # keyingi har bir plot shuni ishlatadi
sns.set_theme(palette="colorblind")      # xuddi shu narsa, style va context bilan birga

# vaqtinchalik, bitta block uchun
with sns.color_palette("Set2"):
    sns.countplot(data=tips, x="day", hue="day", legend=False)
    plt.show()
💡 Bitta rangli plot lar

hue yo'q bo'lganda palette ga umuman qo'l urmang — color="#4C72B0" ni ishlating. Bitta series ga qo'llangan palette yo har bir bar ni boshqacha bo'yaydi (mavjud bo'lmagan farqni ko'rsatib), yoki jimgina e'tiborsiz qoldiriladi. Bitta series — bitta rang.

21.5 Colour-blind xavfsizligi va accessibility

Shimoliy Yevropa kelib chiqishiga ega erkaklarning taxminan 8% ida va ayollarning taxminan 0.5% ida qizil-yashil colour-vision deficiency ning qaysidir shakli bor (deuteranomaly va protanomaly eng keng tarqalgan turlari). 100 talabali auditoriyada bu — sizning chart ingizdagi qizil va yashil series ni ajrata olmaydigan bir necha kishi demakdir. Bunga projector dagi rang siljishi, xira xona va nusxa ko'chirilgan handout larni qo'shsangiz, amaliy nosozlik darajasi yanada yuqori bo'ladi.

Figure ni mustahkam qiladigan qoidalar

  1. Categorical hue uchun colorblind palette ni default qilib oling. Bu — keng tarqalgan deficiency larda ham farqlanadigan bo'lib qolishi uchun tanlangan to'plamdan (Wong palette i) qurilgan qualitative palette. Notebook boshida bir marta sns.set_theme(palette="colorblind") yozish muammoning ko'p qismini hal qiladi.
  2. Hech qachon ma'noni faqat rang orqali kodlamang. Rang ikkinchi channel bilan takrorlanishi kerak. Line plot larda hue= bilan birga style= (dash pattern) ni ham o'zgartiring; scatter plot larda markers= ni o'zgartiring; categorical plot larda kategoriyalarni ma'noli tartibda joylang yoki ularni figure ustida bevosita label qiling, shunda legend zaruriyat emas, qulaylik bo'lib qoladi.
  3. Series soni kam bo'lganda legend o'rniga bevosita label ni afzal ko'ring. Chiziq oxiriga qo'yilgan label rangni solishtirish vazifasini butunlay yo'q qiladi.
  4. jet va kamalak map laridan qoching. Ular perceptually uniform emas: ma'lumotdagi teng qadamlar rangda juda notekis idrok etiladigan qadamlarni beradi. Yorqin moviy va sariq yo'llar soxta chegaralar hosil qiladi va o'quvchilar buni ma'lumotdagi haqiqiy chegara deb qabul qiladi; bundan tashqari map lightness bo'yicha monoton emas, shuning uchun greyscale da butunlay loyqalanib ketadi.
  5. Perceptually uniform ramp lardan foydalaning — viridis, rocket, mako, cividis, cubehelix. Ularda lightness monoton o'sadi, shuning uchun greyscale ga yaxshi o'tadi va har qanday colour deficiency da ham tartibi saqlanadi.
  6. Faqat hue ni emas, kontrastni ham tekshiring. Oq ustidagi och sariq ham, qora ustidagi to'q siyohrang-ko'k ham rang ko'rishdan qat'i nazar yaroqsiz. Projector ostida omon qoladigan narsa — kontrast.
python7 qator
# takrorlanuvchi encoding: rang VA dash pattern VA marker
sns.lineplot(data=fmri, x="timepoint", y="signal",
             hue="event", style="event", markers=True, dashes=True)

# har bir species uchun alohida marker shakli bilan scatter
sns.scatterplot(data=penguins, x="bill_length_mm", y="flipper_length_mm",
                hue="species", style="species", s=70, palette="colorblind")

colorblind palette qizil–yashil rang ko‘rmaslikda ham kategoriyalarni ajratib turadi. Bundan ham yaxshisi: ma’noni hech qachon faqat rang bilan bermang — marker, line style yoki to‘g‘ridan-to‘g‘ri label qo‘shing.

💡 Greyscale sinovi

Figure ni saqlang va uni greyscale ga o'tkazing (yoki shunchaki kafedradagi oq-qora printer da chop eting). Agar series lar hamon ajralib tursa, figure deyarli har qanday o'quvchi va har qanday medium uchun mustahkam. Bu bitta sinov qizil-yashil muammosini, kontrast muammosini va kamalak map muammosini bir yo'la aniqlaydi.

⚠️ Qizil va yashil ma'no tashiydi

Qizil — yomon / yashil — yaxshi tamoyili moliya va dashboard larda kuchli an'ana, va aynan shu juftlikni qizil-yashil deficiency ga ega o'quvchilar ajrata olmaydi. Agar semantikani saqlashingiz shart bo'lsa, ishora, strelka yoki matnli label qo'shing; yoki coolwarm va vlag ishlatadigan ko'k-to'q sariq juftligiga o'ting — u ham "qarama-qarshi yo'nalishlar" ma'nosini beradi, lekin deficiency muammosisiz.

21.6 Figure o'lchami, aspect va DPI

Seaborn da ikki oila function bor va ular o'lchamni turlicha qabul qiladi. Buni chalkashtirish — boshlovchilarning eng tez-tez uchraydigan qiyinchiliklaridan biri.

Oila Misollar O'lchamni qanday berish kerak
Axes-level (mavjud Axes ichiga chizadi) scatterplot, lineplot, boxplot, histplot, heatmap, barplot Chaqiruvdan oldin plt.figure(figsize=(w, h)), yoki fig, ax = plt.subplots(figsize=(w, h)) va keyin ax=ax
Figure-level (o'zining figure ini yaratadi) relplot, displot, catplot, lmplot, jointplot, pairplot height= va aspect= — bular butun figure ni emas, har bir facet ni o'lchaydi
FORMULAfacet eni (dyuym) = height × aspect. Umumiy figure eni ≈ ustunlar soni × height × aspect.
python14 qator
# axes-level: avval figure o'lchamini bering
plt.figure(figsize=(10, 6))
sns.boxplot(data=tips, x="day", y="total_bill")

# yoki aniq va afzal ko'riladigan shakl
fig, ax = plt.subplots(figsize=(10, 6))
sns.boxplot(data=tips, x="day", y="total_bill", ax=ax)

# figure-level: har bir facet bo'yi 4, eni 4*1.4 = 5.6
g = sns.relplot(data=penguins, x="bill_length_mm", y="flipper_length_mm",
                col="species", height=4, aspect=1.4)

# jointplot kvadrat: faqat height
sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", height=7)
⚠️ Figure-level function lar `plt.figure(figsize=...)` ni e'tiborsiz qoldiradi

relplot, catplot, displot va shu kabilar o'zining Figure ini yaratadi. Undan oldin ochgan figure ingiz bo'sh qoladi va tashlab yuboriladi, o'lcham sozlamangiz esa hech qanday natija bermaydi. height/aspect dan foydalaning. Agar keyin aniq dyuym kerak bo'lsa: g.figure.set_size_inches(12, 5).

Medium ga mos o'lcham tanlash

Medium Tavsiya etilgan figsize (dyuym) DPI
Notebook da izlanish (8, 5) 100 (default)
16:9 slide, chart butun slide ni to'ldiradi (13.33, 7.5) 150–200
16:9 slide, chart matn yonida (7, 5) 150–200
A4 handout, to'liq en (6.5, 4) 300
Ikki ustunli maqola, bitta ustun (3.5, 2.5), context="paper" bilan 300–600

DPI (dyuymdagi nuqtalar soni) dyuymlarni piksellarga ko'paytiradi: 10×6 dyuymli figure 300 dpi da 3000×1800 piksel bo'ladi. Ekranlarga taxminan 100 dpi yetarli; projector lar bag'rikeng, lekin 150–200 dan foyda ko'radi; chop etish uchun 300 kerak. E'tibor bering: DPI ni oshirish matnni nisbatan kattaroq qilmaydi — u shunchaki hamma narsani bir xil nisbatda o'tkirroq qiladi. Agar matn juda kichik bo'lsa, context ni o'zgartiring; agar rasm loyqa bo'lsa, DPI ni o'zgartiring.

python4 qator
# notebook dagi har bir figure kattaroq va o'tkirroq chizilsin
plt.rcParams["figure.figsize"] = (9, 5.5)
plt.rcParams["figure.dpi"] = 110        # ekranda chizish
plt.rcParams["savefig.dpi"] = 300       # dpi uzatmasangiz savefig shuni ishlatadi

21.7 Label lar, sarlavhalar, tick lar va legend lar

Seaborn axis larni ustun nomlari bilan label qiladi, lekin bu deyarli hech qachon o'quvchi ko'rishi kerak bo'lgan narsa emas. total_bill — bu variable nomi; "Total bill (USD)" — bu label. O'lchov birligi label ichida bo'lishi kerak.

Ikkita teng kuchli uslub

python13 qator
# pyplot uslubi: "joriy" axes ustida ishlaydi
sns.scatterplot(data=tips, x="total_bill", y="tip")
plt.xlabel("Total bill (USD)")
plt.ylabel("Tip (USD)")
plt.title("Tips rise with the bill, with widening spread", fontsize=14, pad=12)

# obyekt uslubi: aniq, bittadan ko'p axes bo'lganda afzal
ax = sns.scatterplot(data=tips, x="total_bill", y="tip")
ax.set(xlabel="Total bill (USD)",
       ylabel="Tip (USD)",
       title="Tips rise with the bill",
       xlim=(0, 60),
       ylim=(0, 12))

Figure-level plot lardagi sarlavhalar

FacetGrid da har bir facet ning o'z sarlavhasi bor va ular ustiga figure darajasidagi sarlavha qo'shish kerak:

python6 qator
g = sns.catplot(data=tips, x="day", y="total_bill", col="sex", kind="box", height=4)

g.set_axis_labels("Day of week", "Total bill (USD)")
g.set_titles("{col_name}")                       # har bir facet uchun shablon
g.figure.suptitle("Bill distribution by day and sex", y=1.03, fontsize=15)
g.tight_layout()

Tick label lari

python12 qator
# uzun kategoriya nomlarini burang; ha="right" label oxirini o'z tick i ostida ushlaydi
plt.xticks(rotation=45, ha="right")

# obyekt uslubi
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha="right")

# tick larni aniq qayta nomlash
ax.set_xticks([0, 1, 2, 3])
ax.set_xticklabels(["Thursday", "Friday", "Saturday", "Sunday"])

# FacetGrid ustida
g.set_xticklabels(rotation=45, ha="right")

Minglik ajratgichlari, valyuta va foizlar matplotlib.ticker dan olinadi:

python10 qator
from matplotlib.ticker import FuncFormatter, PercentFormatter

ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f"{x:,.0f}"))
# 1250000 -> "1,250,000"

ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f"${x:,.0f}"))
ax.yaxis.set_major_formatter(PercentFormatter(xmax=1.0))   # 0.42 -> "42%"

# ixcham million ko'rinishi
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: f"{x/1e6:.1f}M"))
⚠️ Uzun label lar jimgina ustma-ust tushadi

Matplotlib tick label lari orasidagi to'qnashuvni aniqlamaydi; u shunchaki ularni bir-birining ustiga chizaveradi. Agar kategoriya nomi sakkiz belgidan uzun bo'lsa, yo 45° ga buring, yo — odatda yaxshiroq yo'l — chart ni ag'daring va kategoriyalar y axis bo'ylab pastga tushsin (x="category" o'rniga y="category"), u yerda label lar gorizontal va o'qish oson bo'ladi.

Legend lar

python13 qator
ax = sns.scatterplot(data=penguins, x="bill_length_mm", y="flipper_length_mm", hue="species")

plt.legend(title="Species", loc="lower right", frameon=True)

# legend ni axes tashqarisiga chiqaring, u hech qachon ma'lumotni yopmasin
plt.legend(title="Species", loc="upper left", bbox_to_anchor=(1.05, 1), borderaxespad=0)
plt.tight_layout()

# plot ustidagi gorizontal legend — keng slide larda yaxshi
plt.legend(title=None, loc="lower center", bbox_to_anchor=(0.5, 1.02), ncol=3, frameon=False)

# butunlay olib tashlash (masalan hue x axis ni takrorlaganda)
ax.get_legend().remove()

Figure-level function lar legend ni grid obyektida boshqaradi:

python11 qator
g = sns.relplot(data=penguins, x="bill_length_mm", y="flipper_length_mm", hue="species")
g.legend.set_title("Species")

# uni grid yonida emas, facet ichida chizish
g = sns.relplot(data=penguins, x="bill_length_mm", y="flipper_length_mm",
                hue="species", legend="full")
sns.move_legend(g, "upper left", bbox_to_anchor=(.55, .45))

# sns.move_legend Axes da ham ishlaydi va sarlavhani saqlaydi
ax = sns.scatterplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
sns.move_legend(ax, "upper left", bbox_to_anchor=(1, 1), title="Species")
📌 Ikkinchi `plt.legend()` emas, `sns.move_legend()` ni ishlating

Seaborn legend ni qurib bo'lgandan keyin plt.legend(loc=...) ni chaqirish uni artist lardan qaytadan quradi va seaborn ning sarlavhasi hamda tartibini jimgina yo'qotadi. sns.move_legend() (v0.11.2+) mavjud legend ni ko'chiradi va uning mazmunini butun saqlaydi.

21.8 Plot ga annotation qo'shish

Annotation — figure o'z xulosasini aytadigan usul. Slide da annotation ko'pincha ma'lumotning o'zidan muhimroq: tinglovchilarda 15 soniya bor, strelka esa ularga qayerga qarashni ko'rsatadi.

Matn va strelkalar

python14 qator
ax = sns.scatterplot(data=tips, x="total_bill", y="tip")

ax.annotate("Unusually generous tip",
            xy=(23.7, 10.0),                  # ko'rsatilayotgan nuqta
            xytext=(35, 9.5),                 # matn joylashadigan joy
            arrowprops=dict(arrowstyle="->", color="#444444", lw=1.4),
            fontsize=11, color="#444444")

# oddiy matn, strelkasiz; koordinatalar ma'lumot birligida
ax.text(45, 2, "n = 244", fontsize=10, style="italic", color="grey")

# koordinatalar axes ulushida (0-1), ma'lumot oralig'iga bog'liq emas
ax.text(0.02, 0.95, "Source: Seaborn tips dataset",
        transform=ax.transAxes, fontsize=9, va="top", color="grey")
💡 `transform=ax.transAxes`

Ma'lumot koordinatalari axis chegaralari o'zgarganda siljiydi, axes ulushidagi koordinatalar esa siljimaydi. Burchakka biriktirilgan hamma narsa uchun — manba izohlari, tanlanma hajmi, izohlar — transAxes ni ishlating; ma'lumot koordinatalarini esa faqat matn aniq bir kuzatuvga bog'lanib turishi kerak bo'lganda ishlating.

Reference chiziqlari va soyalangan sohalar

`mean_tip = tips["tip"].mean()

ax.axhline(mean_tip, color="#C44E52", linestyle="--", linewidth=1.5, label=f"Mean tip = ${mean_tip:.2f}") ax.axvline(20, color="grey", linestyle=":", linewidth=1)

bir polosani ajratib ko'rsatish, masalan maqsadli oraliq

ax.axhspan(3, 5, color="#4C72B0", alpha=0.10) ax.axvspan(30, 40, color="grey", alpha=0.08)

ax.legend()`

Bar lardagi qiymat label lari

Matplotlib 3.4 dan boshlab ax.bar_label() har bir bar ustiga qiymatni yozadi. Slide da bu y-axis grid ini butunlay ortiqcha qiladi.

python9 qator
ax = sns.barplot(data=tips, x="day", y="total_bill", errorbar=None,
                 hue="day", palette="crest", legend=False)

for container in ax.containers:
    ax.bar_label(container, fmt="%.1f", padding=3, fontsize=11)

sns.despine(left=True)
ax.set(ylabel="Mean bill (USD)", xlabel="")
ax.yaxis.set_visible(False)          # label lar axis o'rnini bosadi

hue= bilan seaborn har bir hue darajasi uchun alohida container yaratadi, shuning uchun ax.containers bo'yicha loop xavfsiz idiom hisoblanadi. Faqat eng katta bar ni label qilish uchun label lar ro'yxatini uzating va qolganlarini bo'sh string qiling.

21.9 Figure larni to'g'ri saqlash

Kanonik chaqiruv, ya'ni yodlab olish kerak bo'lgani:

YODLANGplt.savefig("figure.png", dpi=300, bbox_inches="tight")
python7 qator
plt.figure(figsize=(9, 5.5))
sns.boxplot(data=tips, x="day", y="total_bill", hue="day", palette="colorblind", legend=False)
plt.title("Total bill by day")
plt.tight_layout()

plt.savefig("bill_by_day.png", dpi=300, bbox_inches="tight")
plt.show()          # saqlagandan KEYIN ko'rsating, hech qachon oldin emas

Har bir argument nima qiladi

ArgumentTa'siri

dpi=300Resolution. Ekran/web uchun 100, projector slide lari uchun 150–200, chop etish uchun 300, jurnal chiziqli grafikasi uchun 600. Figsize ni piksellarga ko'paytiradi. bbox_inches="tight"Bounding box ni haqiqatda chizilgan hamma narsani qamrab oladigan qilib qayta hisoblaydi. Aynan shu narsa burilgan tick label larini, uzun y-label larni, suptitle ni va bbox_to_anchor bilan tashqariga chiqarilgan legend ni saqlab qoladi — aks holda ularning hammasi kesilib qoladi. pad_inches=0.1Tight bounding box atrofida qoldiriladigan chekka. Chetdan chetgacha to'ldirilgan slide rasmi uchun 0 ni ishlating. transparent=TrueFigure va axes fonini olib tashlaydi, shunda slide ning o'z foni ko'rinib turadi. To'q mavzudagi taqdimotlar uchun zarur. Diqqat: bu oq matnni oq ustida, qora matnni qora ustida ko'rinmas qiladi — haqiqiy slide da tekshiring. facecolor="white"Buning aksi: majburiy shaffof bo'lmagan oq fon; to'q notebook mavzusi faylga o'tib ketishi mumkin bo'lgan holatlarda foydali. bbox_extra_artists=[leg]``bbox_inches="tight" bilan birga kamdan-kam kerak bo'ladi; ma'lum artist larni bounding box ichiga majburan qo'shadi.

Format tanlash

FormatTuriNima uchunNimaga e'tibor berish kerak

PNGRasterWeb, README fayllar, chat yoki hujjatga qo'yiladigan hamma narsaResolution qat'iy — kattalashtirilsa loyqalanadi. dpi ni ongli ravishda tanlang. SVGVectorSlide lar, cheksiz zoom kerak bo'lgan web sahifalar, Inkscape yoki Illustrator da keyingi tahrir100k nuqtali scatter plot lar uchun fayl juda katta bo'ladi; ba'zi ofis dasturlari matnni g'alati chizadi. PDFVectorChop etish, LaTeX hujjatlari, jurnalga topshirishJuda zich plot larda xuddi shu o'lcham muammosi. JPGRaster, yo'qotishliChart lar uchun deyarli hech qachonSiqish artefaktlari ingichka chiziq va matnni bulg'aydi; shaffoflik yo'q.

💡 Chop etishga vector, web ga raster, va bitta istisno

Figure chop etilsa yoki projector ga uzatilsa, PDF yoki SVG ni afzal ko'ring — matn har qanday zoom da tiniq qoladi. Istisno — o'n minglab alohida belgidan iborat plot: ma'lumot qatlamini raster qiling, matnni esa vector holida qoldiring — ax.set_rasterized(True) va plt.savefig("f.pdf", dpi=300).

Figure-level plot lar

python7 qator
g = sns.relplot(data=penguins, x="bill_length_mm", y="flipper_length_mm",
                col="species", hue="sex", height=4, aspect=1.1)
g.set_axis_labels("Bill length (mm)", "Flipper length (mm)")
g.figure.suptitle("Penguin bill and flipper dimensions", y=1.04)

g.savefig("penguins.png", dpi=300, bbox_inches="tight")
# ekvivalenti: g.figure.savefig(...)

Bir nechta format ni bir yo'la saqlash

python6 qator
def save_all(name, dpi=300):
    for ext in ("png", "pdf", "svg"):
        plt.savefig(f"{name}.{ext}", dpi=dpi, bbox_inches="tight")

save_all("figures/bill_by_day")
plt.show()

21.10 Matplotlib darajasiga tushish

Seaborn — matplotlib ustidagi qatlam, uning o'rnini bosuvchi emas. Har bir seaborn function i matplotlib obyektini qaytaradi va shu obyekt qo'lingizda bo'lgach, butun matplotlib API si ochiladi. "Seaborn X ni qila olmaydi" degan deyarli har qanday savolning javobi shu.

Seaborn chaqiruvi Nima qaytaradi Figure ni qanday olish mumkin
sns.scatterplot(...) va boshqa axes-level function lar matplotlib.axes.Axes ax.figure
sns.relplot/catplot/displot/lmplot FacetGrid g.figure, alohida axes lar g.axes / g.axes_dict orqali
sns.jointplot JointGrid g.ax_joint, g.ax_marg_x, g.ax_marg_y
sns.pairplot PairGrid g.axes (2-D massiv)
python9 qator
ax = sns.scatterplot(data=penguins, x="bill_length_mm", y="body_mass_g", hue="species")

# endi bu oddiy matplotlib Axes — matplotlib qila oladigan hamma narsani qiling
ax.set_yscale("log")
ax.grid(axis="y", alpha=.3)
ax.spines["top"].set_visible(False)
ax.set_facecolor("#FAFAFA")
ax.tick_params(axis="x", labelsize=11, length=4)
ax.figure.set_size_inches(9, 5)

Seaborn plot larini o'z subplot grid ingizga joylash

Axes-level function lar ax= ni qabul qiladi — ko'p panelli figure ni qo'lda yig'ish shu orqali qilinadi. Figure-level function lar ax= ni qabul qilmaydi — bu ikki oila o'rtasidagi asosiy murosaning mohiyati.

python14 qator
fig, axes = plt.subplots(1, 2, figsize=(12, 5), sharey=True)

sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[0],
            hue="day", palette="crest", legend=False)
axes[0].set_title("Distribution by day")
axes[0].set(xlabel="", ylabel="Total bill (USD)")

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time", ax=axes[1])
axes[1].set_title("Tip vs bill")
axes[1].set(xlabel="Total bill (USD)", ylabel="Tip (USD)")

fig.suptitle("Restaurant tipping behaviour", fontsize=15)
fig.tight_layout()
fig.savefig("panel.png", dpi=300, bbox_inches="tight")
python12 qator
# notekis layout lar: 2 qator, ikkinchi qator ikkala ustunni egallaydi
fig = plt.figure(figsize=(12, 8))
gs = fig.add_gridspec(2, 2)

ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, :])

sns.histplot(data=tips, x="total_bill", ax=ax1)
sns.histplot(data=tips, x="tip", ax=ax2)
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="day", ax=ax3)
fig.tight_layout()

Grid ning alohida facet lariga murojaat qilish

python11 qator
g = sns.catplot(data=tips, x="day", y="total_bill", col="sex", kind="box", height=4)

# pozitsiya bo'yicha
g.axes[0, 0].axhline(tips["total_bill"].mean(), color="red", ls="--")

# nom bo'yicha, facet lar qayta tartiblanganda xavfsizroq
g.axes_dict["Male"].set_title("Male customers")

# har bir facet ga biror narsani qo'llash
for ax in g.axes.flat:
    ax.tick_params(labelrotation=30)

21.11 Tuzoqlar

⚠️ `show()` dan keyingi `savefig()` bo'sh rasm yozadi

Ko'pchilik backend larda plt.show() figure ni chizadi va keyin uni tozalaydi. Undan keyin kelgan plt.savefig() yangi, bo'sh figure ustida ishlaydi va hech qanday xato xabarisiz bo'm-bo'sh oq fayl hosil qiladi. Har doim ko'rsatishdan oldin saqlang. Agar allaqachon ko'rsatib bo'lgan bo'lsangiz, butun plot cell ini qayta ishga tushiring. Script larda eng xavfsiz odat: figure ni qurish, saqlash, keyin plt.close(fig).

⚠️ `set_theme()` global holatni o'zgartiradi

sns.set_theme(), sns.set_palette() va sns.set_context() matplotlib.rcParams ga yozadi, u esa global va butun jarayon bo'ylab amal qiladi. 3-cell da o'rnatilgan theme 4-dan 60-gacha bo'lgan cell larda hosil qilingan har bir figure ni jimgina o'zgartiradi, jumladan siz undan oldin yozgan va keyin qayta ishga tushirgan figure larni ham. Theme ni yuqorida bir marta o'rnating; istisnolar uchun with sns.axes_style(...) dan foydalaning; va yodda tuting: boshqa birovning module ini import qilish ham styling ingizni o'zgartirishi mumkin.

⚠️ `plt.figure(figsize=...)` `relplot`/`catplot`/`displot` ga hech qanday ta'sir qilmaydi

Figure-level function lar o'z figure ini quradi va sizniki egasiz qolib ketadi. height= va aspect= ni ishlating, ular bitta facet ni o'lchashini unutmang: height=4, aspect=1.5 bilan 3 ustunli grid 18 dyuym enida bo'ladi.

⚠️ Ma'lumotni yopib qo'yadigan legend

Matplotlib ning loc="best" parametri ma'lumotdan qochishga harakat qiladi, lekin faqat bir nechta nomzod pozitsiyani tekshiradi va zich plot larda yutqazadi. Legend ni bbox_to_anchor=(1.05, 1) bilan tashqariga chiqaring va bbox_inches="tight" bilan saqlang, shunda kengaygan box kesilmaydi — bu ikkisi doim birga yuradi.

⚠️ Loyqa slide rasmlari

Jupyter da o'ng tugmani bosib "save image" qilsangiz, ekrandagi render ni olasiz — odatda 100 dpi, u projector da yumshoq ko'rinadi va kattalashtirilganda juda yomon chiqadi. Har doim plt.savefig(..., dpi=200) yoki undan yuqori bilan export qiling, yoki SVG/PDF ni ishlatib, projector ning o'zi native resolution da raster qilsin.

⚠️ Palette/ma'lumot nomuvofiqligi, yana bir bor

Tartibsiz kategoriyalarga qo'llangan sequential palette mavjud bo'lmagan reyting o'ylab topadi; tartiblangan ma'lumotga qo'llangan qualitative palette esa mavjud tartibni yo'q qiladi. Ikkalasi ham jimgina sodir bo'ladi — kod ishlaydi, figure rang-barang ko'rinadi, o'quvchi esa noto'g'ri xulosa chiqaradi. Har bir palette= dan oldin u qanday turdagi variable ni kodlayotganini so'rang.

⚠️ `tight_layout()` — bu `bbox_inches="tight"` emas

plt.tight_layout() subplot larni mavjud canvas ichida qayta joylashtiradi; bbox_inches="tight" esa saqlangan faylni chizilgan mazmun bo'yicha kesadi. Ular turli muammolarni hal qiladi va ko'pincha ikkalasi ham kerak bo'ladi. tight_layout() axes tashqarisiga qo'yilgan legend lar bilan ogohlantirish beradi yoki noto'g'ri ishlaydi — bunday holda faqat bbox_inches="tight" ga tayaning, yoki figure yaratayotganda constrained_layout=True dan foydalaning.

⚠️ `sns.load_dataset()` ga internet kerak

O'quv dataset lari birinchi marta ishlatilganda GitHub dan yuklab olinadi. Yopiq laboratoriyada yoki offline sinfxonada bu ma'ruza o'rtasida URL xatosini keltirib chiqaradi. Internet borida ularni bir marta cache qilib qo'ying — sns.load_dataset("tips").to_csv("tips.csv", index=False) — va darsda pd.read_csv("tips.csv") bilan yuklang. Muqobil yo'l: seaborn-data repository sini clone qiling va sns.load_dataset(..., data_home="path/to/seaborn-data", cache=True) ni unga yo'naltiring. Allaqachon yuklab olingan dataset lar ~/seaborn-data ostida cache lanadi.

⚠️ Loop larda figure lar to'planib qoladi

Loop ichida figure yaratib, ularni yopmaslik xotirani sizdiradi va matplotlib ning "more than 20 figures have been opened" ogohlantirishini keltirib chiqaradi. Har birini saqlagandan keyin plt.close(fig) — yoki plt.close("all") — ni chaqiring.

📌 Font lar va ASCII bo'lmagan label lar

Agar kategoriya label larida default font da yo'q belgilar bo'lsa, matplotlib "missing from font" ogohlantirishlarini chiqaradi va bo'sh kvadratchalar chizadi. Plot dan oldin alifboingizni qamrab oladigan font ni o'rnating: plt.rcParams["font.family"] = "DejaVu Sans" (keng qamrovli, matplotlib bilan birga keladi), yoki nomi bo'yicha o'rnatilgan har qanday oila. Uni sns.set_theme(font="DejaVu Sans") orqali o'rnatish ham ishlaydi.

21.12 Amaliyot

python38 qator
# 1. total_bill ning day bo'yicha bir xil boxplot ini besh marta chizing, har bir style uchun
#    bir marta (darkgrid, whitegrid, dark, white, ticks). Har biri uchun bittadan gap yozing,
#    qaysi medium ga eng mos kelishini ayting. "ticks" variantiga sns.despine() qo'shing.

# 2. penguins uchun bill_length_mm va flipper_length_mm ni species bo'yicha rangda chizing,
#    bir marta context="notebook" da, bir marta context="talk" da, ikkalasi ham figsize=(8,5) bilan.
#    Canvas o'lchami bir xil qolganini va faqat matn/chiziqlar masshtablanganini tasdiqlang.

# 3. penguins ni body_mass_g bo'yicha (a) "Set2" va (b) "viridis" bilan bo'yang.
#    Keyin species bo'yicha (a) "viridis" va (b) "colorblind" bilan bo'yang.
#    To'rttadan qaysi ikkitasi noto'g'ri ekanini va o'quvchi har biridan qanday
#    noto'g'ri xulosa chiqarishini yozma tushuntiring.

# 4. penguins.corr(numeric_only=True) ni hisoblang va uni heatmap sifatida chizing:
#    cmap="vlag", center=0, vmin=-1, vmax=1, annot=True. Keyin center= siz qayta chizing
#    va kuchsiz correlation larning o'qilishi qanday o'zgarishini ta'riflang.

# 5. Universitetingiz brend ranglarining uchta hex kodidan custom palette yasang,
#    uni tips["day"] ning countplot iga qo'llang va palette ning hex kod larini
#    .as_hex() bilan qayta chiqaring.

# 6. day bo'yicha o'rtacha total_bill ning barplot ini yasang. ax.bar_label() bilan
#    qiymat label lari, umumiy o'rtachada punktir qizil axhline, eng baland bar ga
#    ko'rsatuvchi annotate() strelkasi va axes koordinatalarida manba izohini qo'shing.

# 7. fig, axes = plt.subplots(1, 2, figsize=(12,5)) yarating. Chapga total_bill ning
#    histplot ini, o'ngga tip va total_bill ning scatterplot ini qo'ying,
#    har biriga sarlavha bering, suptitle qo'shing va scatter ning legend ini
#    bbox_to_anchor=(1.05, 1) bilan axes tashqarisiga chiqaring.

# 8. YAKUNIY: taqdimotga tayyor bitta figure yasang va uni saqlang.
#    - sns.set_theme(style="whitegrid", context="talk", palette="colorblind")
#    - figsize (11, 6), penguins, x=species, y=body_mass_g, hue=sex
#    - o'lchov birligi bilan odam o'qiy oladigan axis label lari, xulosani aytadigan sarlavha
#    - legend axes tashqarisida, sns.despine(left=True)
#    - slide.png (dpi=200, transparent=True) VA handout.pdf sifatida saqlang
#      (bbox_inches="tight"), saqlash plt.show() dan OLDIN bo'lsin
#    - ikkala faylni oching va hech narsa kesilib qolmaganini tekshiring.

21.13 Intervyu savollari

S: Seaborn da style va context o'rtasidagi farq nima?

Style plot foni ko'rinishini boshqaradi: panel rangi, grid chiziqlari va axis spine lari — darkgrid, whitegrid, dark, white, ticks. Context esa elementlarning masshtabini boshqaradi: font o'lchamlari, chiziq qalinligi, marker o'lchamlari — paper, notebook, talk, poster. Ular bir-biridan mustaqil, ikkalasi ham sns.set_theme() orqali o'rnatiladi va ikkalasi ham figure ning fizik o'lchamlarini o'zgartirmaydi.

S: Qachon sequential emas, diverging palette ishlatasiz?

Variable da o'quvchi bir qarashda topa oladigan ma'noli o'rta nuqta bo'lganda — foyda va zarar yoki correlation uchun nol, o'tgan yilga nisbatan o'zgarish uchun baseline, z-score uchun o'rtacha qiymat. Neytral markaz rangi shu o'rta nuqtani belgilaydi, ikki hue esa yo'nalishni ko'rsatadi. Uni center=0 (yoki simmetrik vmin/vmax) bilan mustahkamlash shart; aks holda neytral rang tasodifiy qiymatga tushadi va o'quvchilar kichik effektlarning ishorasini noto'g'ri baholaydi. Alohida o'rtasi bo'lmagan, faqat pastdan yuqoriga o'sadigan miqdor uchun — count, narx, aholi soni — sequential palette to'g'ri tanlov.

S: Nega jet yomon colormap hisoblanadi?

U perceptually uniform emas. Ma'lumotdagi teng qadamlar juda notekis idrok etiladigan rang o'zgarishlarini beradi, ya'ni map ba'zi oraliqlarni siqadi, ba'zilarini bo'rttiradi. Uning yorqin moviy va sariq yo'llari keskin chegaradek o'qiladi va o'quvchilar ma'lumotda mavjud bo'lmagan chegaralarni ko'radi. Lightness monoton emas, shuning uchun greyscale da yoki nusxa ko'chirilganda u tushunarsiz aralashmaga aylanadi va u colour-blind uchun xavfsiz emas. viridis, rocket, mako va cividis aynan shu muammolarni hal qilish uchun yaratilgan.

S: sns.relplot() uchun figure o'lchamini qanday berasiz va nega plt.figure(figsize=...) ishlamaydi? relplot — figure-level function: u ichkarida o'zining Figure ini yaratadi, shuning uchun undan oldin ochilgan har qanday figure tashlab yuboriladi. Uni height= va aspect= bilan o'lchang, ular bitta facet o'lchamini belgilaydi — facet eni height * aspect ga teng, butun figure esa taxminan ustunlar soniga ko'paytirilgan shu qiymatga teng. Aniq dyuym kerak bo'lsa, keyin g.figure.set_size_inches(w, h) bilan sozlang.

S: Saqlangan PNG ingiz bo'sh chiqdi. Nima bo'ldi?

Deyarli aniq: plt.savefig() plt.show() dan keyin chaqirilgan. show() joriy figure ni chiqaradi va tozalaydi, shuning uchun savefig() bo'sh canvas ni yozadi — jimgina, hech qanday xatosiz. Yechim: avval saqlash, keyin ko'rsatish; yoki aniq handle saqlash (fig, ax = plt.subplots()) va fig.savefig() ni chaqirish — u aynan shu figure ga bog'langan va tartibdan ta'sirlanmaydi.

S: bbox_inches="tight" nima qiladi va qachon u zarur?

U saqlanadigan rasmning bounding box ini nominal figure to'rtburchagidan emas, haqiqatda chizilgan artist lardan qayta hisoblaydi. Mazmun default box dan tashqariga chiqqanda u zarur: 45 gradusga burilgan tick label lari, uzun axis label lari, axes ustiga qo'yilgan suptitle, va eng muhimi bbox_to_anchor bilan tashqariga ko'chirilgan legend. Usiz bu elementlar ekranda yaxshi ko'ringan bo'lsa ham, faylda kesilib qoladi. Bu plt.tight_layout() dan farq qiladi — u subplot larni mavjud canvas ichida qayta joylashtiradi.

S: Chart ni colour-blind o'quvchilar uchun qanday qulay qilasiz?

colorblind qualitative palette ini yoki viridis kabi perceptually uniform sequential map ni ishlating; hech qachon rangga yagona channel sifatida tayanmang — marker shakllari, dash pattern lari yoki bevosita label lar qo'shing, shunda encoding takrorlanadi; qarama-qarshi ma'nolar uchun qizil/yashil juftligidan qoching va ko'k/to'q sariq ni afzal ko'ring; lightness kontrastini yuqori ushlang; va figure ni greyscale ga o'tkazib tekshiring — bu bitta sinov rang ko'rish, kontrast va kamalak map muammolarini birdaniga aniqlaydi.

S: Seaborn sizga kerak narsani qila olmayapti — masalan log y axis, soyalangan soha, yoki 2×2 aralash panel. Nima qilasiz?

Matplotlib darajasiga tushing. Axes-level function lar matplotlib.axes.Axes ni qaytaradi, ya'ni ax = sns.scatterplot(...), keyin ax.set_yscale("log"), ax.axhspan(...), ax.spines[...] va API ning qolgan qismi to'liq ochiq. Layout lar uchun grid ni o'zingiz fig, axes = plt.subplots(2, 2) bilan quring va har bir seaborn chaqiruviga ax=axes[0, 1] ni uzating. Figure-level function lar ax= ni qabul qilmaydi, lekin o'z axes larini g.axes, g.axes_dict va g.figure orqali ochib beradi.

S: PNG va SVG da saqlash o'rtasidagi amaliy farq nima?

PNG — raster: qat'iy piksel to'ri, uning o'tkirligi saqlash paytida dpi bilan belgilanadi; kattalashtirilsa loyqalanadi. SVG (va PDF) — vector: shakllar va matn ko'rsatmalar sifatida saqlanadi va har qanday zoom da qaytadan tiniq chiziladi, shuningdek vector dasturlarida tahrir qilinaveradi. Chop etish, slide va maqolalar uchun vector ni ishlating; web, chat va hujjatlar uchun, yoki o'n minglab belgili plot lar uchun (vector fayl juda katta bo'lib ketadi) PNG ni ishlating — bunday holda faqat ma'lumot qatlamini ax.set_rasterized(True) bilan raster qiling va matnni vector holida qoldiring.

Xulosa

  • sns.set_theme(style=, context=, palette=, font_scale=) — yagona kirish nuqtasi; sns.set() uning deprecated alias i. U global matplotlib holatini o'zgartiradi, shuning uchun uni yuqorida bir marta o'rnating va istisnolar uchun with sns.axes_style(...) dan foydalaning.
  • Beshta style: izlanish uchun darkgrid, handout lar uchun whitegrid, grid zich ma'lumot bilan raqobatlashganda dark/white, nashr uslubidagi figure lar uchun ticks va sns.despine().
  • Context font, chiziq va marker larni masshtablaydi — canvas ni emas. Projector slide lariga talk (1.5×) va poster (2×) kerak; font_scale= esa ustidan aniq sozlaydi.
  • Palette ni variable ga moslang: tartibsiz kategoriyalarga qualitative (colorblind, deep, Set2), pastdan yuqoriga miqdorlarga sequential (viridis, rocket, crest), ma'noli o'rta nuqtali ma'lumotga diverging (vlag, coolwarm, RdBu_r) — har doim center=0 bilan. Nomuvofiqlik jimgina chalg'itadi.
  • Qizil-yashil colour deficiency ga ega ~8% uchun loyihalang: default ni colorblind qiling, hech qachon faqat rang bilan kodlamang, jet dan qoching va greyscale da sinang.
  • Axes-level plot larni plt.figure(figsize=(w, h)) bilan, figure-level plot larni height=/aspect= bilan o'lchang (facet eni = height × aspect); DPI o'tkirlikni boshqaradi, matnning nisbiy o'lchamini emas.
  • Axis larni har doim o'lchov birligi bilan odam tilida qayta label qiling, uzun kategoriya label larini buring yoki chart ni ag'daring, va tiqilib qolgan legend ni bbox_to_anchor=(1.05, 1) yoki sns.move_legend() bilan tashqariga chiqaring.
  • Xulosani figure ustida annotate(), axhline(), ax.text(transform=ax.transAxes) va ax.bar_label() yordamida ayting.
  • plt.savefig(name, dpi=300, bbox_inches="tight") bilan saqlang — plt.show() dan oldin, hech qachon keyin emas — figure-level plot lar uchun g.savefig() ni ishlatib, chop etish va slide lar uchun vector format larni, web uchun PNG ni tanlang.
  • Seaborn qila olmagan hamma narsani matplotlib qila oladi: seaborn haqiqiy Axes, Figure va grid obyektlarini qaytaradi, ax= esa axes-level plot larni siz qurgan har qanday subplot layout iga joylashtirishga imkon beradi.

Keyingisi: 22-bob hammasini birlashtirib, to'liq EDA workflow ini hosil qiladi.

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar