Styling, palette, saqlash
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:
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.
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.
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. |
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.
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.
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
# 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.
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. |
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.
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.
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.
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 |
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.
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. |
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")
- 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. |
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).
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
Set2bilan 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
viridisbilan 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.
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.
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
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
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
# 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.
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
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()
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
- Categorical hue uchun
colorblindpalette 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 martasns.set_theme(palette="colorblind")yozish muammoning ko'p qismini hal qiladi. - Hech qachon ma'noni faqat rang orqali kodlamang. Rang ikkinchi channel bilan takrorlanishi kerak. Line plot larda
hue=bilan birgastyle=(dash pattern) ni ham o'zgartiring; scatter plot lardamarkers=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. - 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.
jetva 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.- 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. - 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.
# 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.
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 — 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 |
height × aspect. Umumiy figure eni ≈ ustunlar soni × height × aspect.# 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)
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.
# 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
# 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:
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
# 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:
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"))
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
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:
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")
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
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")
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.
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:
plt.savefig("figure.png", dpi=300, bbox_inches="tight")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.
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
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
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) |
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.
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")
# 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
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
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).
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.
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.
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.
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.
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.
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.
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 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.
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
# 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 uchunwith sns.axes_style(...)dan foydalaning.- Beshta style: izlanish uchun
darkgrid, handout lar uchunwhitegrid, grid zich ma'lumot bilan raqobatlashgandadark/white, nashr uslubidagi figure lar uchunticksvasns.despine(). - Context font, chiziq va marker larni masshtablaydi — canvas ni emas. Projector slide lariga
talk(1.5×) vaposter(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 doimcenter=0bilan. Nomuvofiqlik jimgina chalg'itadi. - Qizil-yashil colour deficiency ga ega ~8% uchun loyihalang: default ni
colorblindqiling, hech qachon faqat rang bilan kodlamang,jetdan qoching va greyscale da sinang. - Axes-level plot larni
plt.figure(figsize=(w, h))bilan, figure-level plot larniheight=/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)yokisns.move_legend()bilan tashqariga chiqaring. - Xulosani figure ustida
annotate(),axhline(),ax.text(transform=ax.transAxes)vaax.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 uchung.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,Figureva 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.