FacetGrid, pairplot, jointplot
Shu paytgacha chizgan har bir grafikangiz bitta axes to'plamidan iborat edi: bitta x-axis, bitta y-axis, bitta to'rtburchak siyoh. Bu bob esa shunday holat yetarli bo'lmay qoladigan lahza haqida — ya'ni siz bir xil grafikani dataset ning turli qismlari bo'ylab takrorlashni, yoki barcha o'zgaruvchi juftliklarini bir vaqtning o'zida ko'rishni, yoki bitta bog'liqlik ustiga uni tashkil qiluvchi har bir o'zgaruvchining distribution ini qo'yishni xohlaganingizda. Seaborn bunday konstruksiyalarni grid deb ataydi va aynan shular tufayli bu kutubxona shunchaki "chiroyliroq matplotlib" dan ko'proq narsaga aylangan.
Grid vositalarining hech biri tushunarli bo'lishidan oldin sizga bitta tushuncha kerak: axes-level va figure-level function lar o'rtasidagi ajratish. U siz allaqachon duch kelgan o'nlab kichik chalkashliklarni tushuntiradi — nega plt.title() ba'zan noto'g'ri subplot ga tushib qoladi, nega figsize e'tiborga olinmaydi, nega ba'zi function lar ax= ni qabul qiladi, boshqalari esa rad etadi. Shundan boshlaymiz.
20.1 Figure-level va axes-level: hamma narsani tushuntiradigan ajratish
Seaborn ning chizish function lari ikki xil bo'ladi. Kodda ular bir-biriga o'xshab ko'rinadi, lekin butunlay boshqacha ishlaydi.
Axes-level function bitta matplotlib Axes ustiga chizadi — bitta panel ga. Agar matplotlib majburan yaratishga to'g'ri kelmasa, u o'zi uchun figure yaratmaydi. U ax= argumentini qabul qiladi, shuning uchun uni o'zingiz qurgan layout ning aniq bir panel iga yo'naltirishingiz mumkin, va u o'sha Axes obyektini qaytaradi.
Figure-level function esa butun bir matplotlib Figure ni boshqaradi. U figure ni o'zi yaratadi, qancha panel kerakligini o'zi hal qiladi, har biriga axes-level function ni chizadi, panel lardan tashqarida legend qo'shadi va butun tuzilmani o'rab turadigan seaborn Grid obyektini (FacetGrid, PairGrid yoki JointGrid) qaytaradi. Unda ax= parametri yo'q, chunki "qaysi axes?" degan savolga javob berish uning o'z vazifasi.
Axes-level function — bu siz bitta xolst berib: "shu yerga chiz" degan rassom. Figure-level function esa — galereya kuratori: siz mavzuni tasvirlab berasiz, kurator esa nechta xolst kerakligini o'zi hal qiladi, ularni devorga qatorlab osadi, har biriga yorliq yopishtiradi va eshik yonida bitta umumiy izohni qo'yadi. Kuratorga xolst tutqazib bo'lmaydi — devor uning ixtiyorida.
Yodlab olish kerak bo'lgan juftliklar
Har bir figure-level function — bu kind= argumenti orqali axes-level function lar oilasiga murojaat qiladigan yupqa wrapper. Bunday oila roppa-rosa to'rtta.
| Figure-level | U o'rab turgan axes-level function lar | Qaysi argument bilan tanlanadi | Qaytariladigan Grid |
|---|---|---|---|
sns.relplot() |
scatterplot, lineplot |
kind="scatter" (default), "line" |
FacetGrid |
sns.displot() |
histplot, kdeplot, ecdfplot, rugplot |
kind="hist" (default), "kde", "ecdf" |
FacetGrid |
sns.catplot() |
stripplot, swarmplot, boxplot, violinplot, boxenplot, pointplot, barplot, countplot |
kind="strip" (default), "swarm", "box", "violin", "boxen", "point", "bar", "count" |
FacetGrid |
sns.lmplot() |
regplot |
— (kind= yo'q; doim regression) |
FacetGrid |
sns.pairplot() |
scatterplot, histplot, kdeplot, regplot |
kind=, diag_kind= |
PairGrid |
sns.jointplot() |
scatterplot, kdeplot, histplot, regplot, residplot |
kind="scatter" (default), "kde", "hist", "hex", "reg", "resid" |
JointGrid |
plot bilan tugasa va mark ni tasvirlasa (scatter, box, hist), u axes-level. Agar plot bilan tugasa-yu, bog'liqlik yoki maqsad ni tasvirlasa (rel, dis, cat, lm, pair, joint), u figure-level. "Kategoriya so'zi + -plot" ko'rinishidagi to'rtta function — relplot, displot, catplot, lmplot — faceting ning asosiy ish otlari.Oqibatlari, birma-bir
Bu farq nazariy emas. U oltita aniq narsani o'zgartiradi.
| Savol | Axes-level (scatterplot) |
Figure-level (relplot) |
|---|---|---|
| Nima qaytaradi? | matplotlib Axes |
seaborn FacetGrid |
| Mavjud subplot ga yo'naltira olamanmi? | Ha — ax=axes[0, 1] |
Yo'q — figure uning o'z ixtiyorida |
| O'lchamni qanday belgilayman? | plt.figure(figsize=(8, 5)) yoki plt.subplots(figsize=...) |
height= (har bir facet uchun dyuym) va aspect= (eni ÷ bo'yi) |
| O'zgaruvchi bo'yicha facet qila olamanmi? | Yo'q — col=/row= yo'q |
Ha — col=, row=, col_wrap= |
| Legend qayerga tushadi? | Axes ichiga, ko'pincha ma'lumot ustiga | Panel lardan tashqarida, figure chetida |
| Subplot mozaikasiga qo'shila oladimi? | Ha, uning vazifasi shu | Yo'q — ikkita figure-level grafikani birlashtirish uchun ularni alohida chizish kerak |
import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") # --- axes-level: figure ni men boshqaraman, seaborn panel ni to'ldiradi --- fig, axes = plt.subplots(1, 2, figsize=(11, 4)) sns.scatterplot(data=tips, x="total_bill", y="tip", ax=axes[0]) sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[1]) axes[0].set_title("Bill vs tip") # aniq bir panel ga sarlavha qo'yish ishlaydi fig.suptitle("Two views of the tips data") fig.tight_layout() # --- figure-level: figure ni seaborn boshqaradi, men tuzilmani tasvirlab beraman --- g = sns.relplot(data=tips, x="total_bill", y="tip", col="day", col_wrap=2, hue="sex", height=3.2, aspect=1.1) g.figure.suptitle("Bill vs tip by day", y=1.03)
Qanday tanlash kerak
Qaror deyarli mexanik tarzda chiqadi:
- Figure-level dan foydalaning, qachonki grafika butun figure ning o'zi bo'lsa: tadqiq qilish, notebook dagi bitta grafika va, eng muhimi,
col=yokirow=faceting kerak bo'lgan har qanday holat. Bunda shared axes, bitta umumiy legend va izchil o'lcham bepul beriladi. - Axes-level dan foydalaning, qachonki grafika siz o'zingiz yig'ayotgan layout ning bir bo'lagi bo'lsa: scatter, bar chart va jadval izohi bor hisobot figure si; matplotlib
GridSpecichiga tushadigan har qanday narsa; sizgaAxesuzatadigan dashboard framework ichidagi har qanday narsa.
Figure-level chaqiruv — bu axes-level chaqiruvlar ustidagi qulaylik. Agar figure-level function siz xohlagan ishni bajara olmasa, figure ni plt.subplots() bilan o'zingiz quring va loop ichida axes-level function ni ax= bilan chaqiring. Hech narsa yo'qolmaydi — shunchaki kurator ning ishini qo'lda bajarasiz.
Figure-level function lar figure ni emas, facet ni o'lchaydi. height=4, aspect=1.5 degani — har bir panel 4 dyuym balandlikda va 6 dyuym enida; umumiy figure o'lchami esa row va column soniga qarab hisoblanadi. Bu ataylab shunday: yangi column qo'shilganda figure kengayishi kerak, mavjud panel lar siqilib qolishi emas.
20.2 FacetGrid va small multiples
G'oya: small multiples
Edward Tufte bu usulni small multiples deb atagan: bitta grafika dizaynini olib, uni o'zgartirmasdan dataset ning bo'laklari bo'ylab takrorlaysiz va hammasini bir xil masshtabda yonma-yon joylashtirasiz. Dizayn o'zgarmas bo'lgach, o'quvchining butun diqqati panel lar orasidagi farqlarga qaratiladi.
Buning ishlashi sababi idrok bilan bog'liq. Inson ko'zi umumiy masshtabdagi pozitsiya ni juda aniq baholaydi, colour va yuza ni esa yomon baholaydi. "Hafta kuni" ni bitta gavjum scatter da beshta rang bilan kodlash ko'zni u eng yomon uddalaydigan ishga majbur qiladi. Uni beshta panel bilan, har birida bir xil axis chegaralari bilan kodlash esa ko'zga u yaxshi uddalaydigan ishni beradi: bulut qayerda joylashganini solishtirish.
Colour bilan kodlash (1 panel) Small multiples (beshta panel)
+---------------------+ +------+ +------+ +------+
| x o * x o * | | Thur | | Fri | | Sat |
| o * x o * x o | | .. | | .. | | .. |
| * x o * x o | | ... | | . | | .... |
+---------------------+ +------+ +------+ +------+
qiyin: 5 ta rangni ajratish oson: 5 ta pozitsiyani solishtirish
Small multiples: bir xil grafik har bir qism uchun takrorlanadi. Ko‘z panellar bo‘ylab o‘rin ni taqqoslashda tiqilinch legend dagi ranglarni taqqoslashdan ancha aniqroq.
Small multiples — bu flip-book (varaqlanadigan multfilm daftari). Har bir sahifa bir xil chizilgan, shuning uchun siz varaqlaganingizda faqat o'zgarayotgan narsa harakatlanayotgandek ko'rinadi. Hamma narsani bitta panel ga turli ranglar bilan ustma-ust chizish esa flip-book ning har bir sahifasini bitta varaqqa ustma-ust bosib chiqarishga o'xshaydi.
Oson yo'l: col= va row=
Holatlarning to'qson foizida siz FacetGrid ga umuman to'g'ridan-to'g'ri tegmaysiz. Figure-level function ga col= va row= uzatasiz, u esa grid ni siz uchun quradi.
tips = sns.load_dataset("tips") # har bir kunga bitta column, row lar esa smoker holati bo'yicha ajratilgan g = sns.relplot(data=tips, x="total_bill", y="tip", col="day", row="smoker", hue="sex", height=2.8, aspect=1.2) # xuddi shu tuzilma, lekin kategoriyali mark bilan g = sns.catplot(data=tips, x="sex", y="total_bill", col="day", kind="box", col_wrap=2, height=3) # va distribution lar bilan penguins = sns.load_dataset("penguins") g = sns.displot(data=penguins, x="flipper_length_mm", col="species", row="sex", kind="hist", bins=20, height=2.6)
`col="day", row="smoker" quyidagini hosil qiladi:
day=Thur day=Fri day=Sat day=Sun smoker=Yes +-----------+ +-----------+ +-----------+ +-----------+ | | | | | | | | +-----------+ +-----------+ +-----------+ +-----------+ smoker=No +-----------+ +-----------+ +-----------+ +-----------+ | | | | | | | | +-----------+ +-----------+ +-----------+ +-----------+ (x va y axes lar default bo'yicha barcha panel da shared)`
Qo'lda quriladigan yo'l: FacetGrid yaratish
Ba'zan wrapper sizga yordam bera olmaydi, chunki siz chizmoqchi bo'lgan mark relplot/catplot/displot biladigan mark lardan biri emas. Bunday holatda grid ni o'zingiz qurasiz. Bu ikki bosqichli jarayon: avval layout ni aniqlaysiz, keyin chizish function ini har bir panel ga map qilasiz.
import matplotlib.pyplot as plt # 1-qadam: layout ni aniqlash — panel lar bor, lekin hali ma'lumot chizilmagan g = sns.FacetGrid(tips, col="day", row="smoker", height=2.5, aspect=1.2, hue="sex") # 2-qadam: chizish funksiyasini har bir qism ustiga map qilish g.map(sns.scatterplot, "total_bill", "tip", alpha=0.7) # 3-qadam: legend, chunki map() uni o'zi qo'shmaydi g.add_legend(title="Sex")
Uchta map qilish metodi mavjud va ular orasidagi farq muhim.
| Metod | Sizning funksiyangizga nima uzatadi | Nima uchun ishlatiladi |
|---|---|---|
g.map(func, "x", "y", ...) |
Pozitsion vektorlar: func(x_series, y_series, **kws) |
matplotlib function lari (plt.hist, plt.scatter) va oddiy seaborn chaqiruvlari |
g.map_dataframe(func, x="a", y="b") |
Qism DataFrame ni data= sifatida, ustiga column nomlarini keyword sifatida |
Zamonaviy seaborn function lari va butun qismni talab qiladigan har qanday custom function |
g.map_diag(...) / g.map_offdiag(...) |
(faqat PairGrid uchun — §20.5 ga qarang) |
Diagonal ustida va undan tashqarida turli mark lar |
# map_dataframe: funksiya data=subset ni oladi, shuning uchun istalgan column dan foydalana oladi g = sns.FacetGrid(tips, col="time", height=3.5) g.map_dataframe(sns.scatterplot, x="total_bill", y="tip", hue="size", palette="viridis") g.add_legend() # map() orqali oddiy matplotlib funksiyasi: xom massivlarni oladi g = sns.FacetGrid(tips, col="day", col_wrap=2, height=2.5) g.map(plt.hist, "total_bill", bins=15, color="steelblue", edgecolor="white")
Grid ustida custom function lar
Qo'lda qurilgan FacetGrid o'z o'rnini aynan shu yerda oqlaydi: siz istalgan narsani, jumladan o'zingiz yozgan function ni ham map qila olasiz. Map qilingan function "joriy" axes ustiga chizishi kerak — funksiyangiz chaqirilganda matplotlib ning plt.gca() si allaqachon kerakli panel ga sozlangan bo'ladi.
import numpy as np def bill_vs_tip_with_reference(data, **kws): # ma'lumotni chizamiz ax = plt.gca() ax.scatter(data["total_bill"], data["tip"], s=18, alpha=0.6, **kws) # aynan 15% tip da reference chiziq qo'shamiz xs = np.linspace(data["total_bill"].min(), data["total_bill"].max(), 2) ax.plot(xs, 0.15 * xs, ls="--", lw=1, color="0.3") # panel ga uning o'z namuna hajmini yozib qo'yamiz ax.text(0.05, 0.92, f"n = {len(data)}", transform=ax.transAxes, fontsize=9) g = sns.FacetGrid(tips, col="day", col_wrap=2, height=2.8) g.map_dataframe(bill_vs_tip_with_reference) g.set_axis_labels("Total bill ($)", "Tip ($)")
relplot/catplot/displot dan foydalaning, agar sizga quyidagilar kerak bo'lmasa: (a) bu wrapper lar taklif qilmaydigan mark, (b) har bir panel da qatlamlangan ikkita turli mark, (c) har bir panel uchun alohida izoh — masalan n, R² yoki reference chiziq, yoki (d) seaborn dan tashqaridagi chizish function i.Figure-level function lar add_legend() ni siz uchun chaqiradi. Qo'lda qurilgan FacetGrid esa chaqirmaydi — agar constructor ga hue= uzatgan bo'lsangiz-u legend ko'rinmasa, demak g.add_legend() ni unutgansiz. Uni barcha map qilishlardan keyin chaqiring, chunki u map qilish yaratgan artist larni o'qiydi.
20.3 Grid parametrlari: col_wrap, sharing, o'lcham, sarlavhalar
col_wrap — uzun qatorni buklash
Sakkizta darajaga ega o'zgaruvchi bo'yicha faceting bitta qatorda sakkizta panel hosil qiladi va har biri ingichka bo'lakka siqilib qoladi. col_wrap=n esa n ta column dan keyin yangi qatorga o'tkazadi.
titanic = sns.load_dataset("titanic") g = sns.catplot(data=titanic, x="sex", y="age", col="class", row=None, kind="violin", col_wrap=2, height=3)
`col="deck" wrap siz (7 ta panel, o'qib bo'lmaydi): +--+ +--+ +--+ +--+ +--+ +--+ +--+
col="deck", col_wrap=3: +------+ +------+ +------+ | A | | B | | C | +------+ +------+ +------+ +------+ +------+ +------+ | D | | E | | F | +------+ +------+ +------+ +------+ | G | <- oxirgi qatorning to'liq emasligi normal +------+`
col_wrap ni row= bilan birga ishlatib bo'lmaydi. Row o'lchovi vertikal layout ni allaqachon belgilab qo'yadi, shuning uchun buklanadigan narsa qolmaydi. Ikkalasini birga uzatsangiz ValueError: Cannot userowwithcol_wrap`` xatosi chiqadi.
sharex / sharey — halollik regulyatori
Default bo'yicha har bir facet ikkala axis ni ham bo'lishadi: sharex=True, sharey=True. Aynan shared axes small multiples ni solishtiriladigan qiladi — panel lar umumiy masshtabda turadi, shuning uchun balandroq bar haqiqatan ham kattaroq sonni bildiradi. Sharing ni o'chirish har bir panel ga o'z chegaralarini beradi, bu esa faqat panel lar turli narsalarni o'lchaganda to'g'ri bo'ladi.
# har bir facet uchun mustaqil y — har bir panel o'z ma'lumotiga moslanadi g = sns.relplot(data=tips, x="total_bill", y="tip", col="day", col_wrap=2, height=2.6, facet_kws={"sharey": False}) # FacetGrid da bu argument to'g'ridan-to'g'ri beriladi, facet_kws ichida emas g = sns.FacetGrid(tips, col="day", col_wrap=2, sharey=False, height=2.6) g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
sns.FacetGrid(...) da u to'g'ridan-to'g'ri argument. relplot/catplot/displot/lmplot da esa uni facet_kws={"sharey": False} orqali o'tkazish kerak, chunki bu function lar o'z keyword larini asosidagi axes-level function ga uzatadi. sharey=False ni to'g'ridan-to'g'ri relplot ga bersangiz, yo xato chiqadi, yo indamay scatterplot ga uzatiladi — u esa bunday argumentni kutmaydi.
height va aspect
height — bu bitta facet ning dyuymdagi balandligi; aspect esa uning eni balandligiga bo'lingani. Demak facet ning eni height * aspect dyuym bo'ladi. Umumiy figure esa grid bilan birga kattalashadi.
| Sozlamalar | Facet o'lchami | 3×2 grid uchun figure |
|---|---|---|
height=3, aspect=1 |
3 × 3 dyuym | ≈ 9 × 6 dyuym |
height=3, aspect=1.6 |
4.8 × 3 dyuym | ≈ 14.4 × 6 dyuym |
height=2, aspect=0.7 |
1.4 × 2 dyuym | ≈ 4.2 × 4 dyuym |
Bir nechta facet uchun height=3, aspect=1.2; panel lar soni to'qqiztadan oshsa height=2.2 ga tushiring. Time series uchun aspect > 1 ishlating (keng panel trend ni ochib beradi), scatter uchun esa aspect ≈ 1 (kvadrat panel ko'rinadigan qiyalikni buzmaydi).
margin_titles va sarlavha shablonlari
row= va col= birga ishlatilganda har bir panel dagi default sarlavha smoker = Yes | day = Sat ko'rinishida bo'ladi — aniq, lekin takroriy va uzun. margin_titles=True row yorlig'ini o'ng chekkaga ko'chiradi va tepada faqat column yorlig'ini qoldiradi, shunda har bir yorliq bir marta yoziladi.
g = sns.FacetGrid(tips, col="day", row="smoker", margin_titles=True, height=2.4, aspect=1.2) g.map_dataframe(sns.scatterplot, x="total_bill", y="tip") g.set_titles(col_template="{col_name}", row_template="{row_name}") # figure-level funksiya orqali g = sns.relplot(data=tips, x="total_bill", y="tip", col="day", row="smoker", height=2.4, facet_kws={"margin_titles": True})
`margin_titles=False margin_titles=True
smoker=Yes|day=Thur smoker=Yes|day=Fri Thur Fri +----------------+ +---------------+ +--------+ +--------+ | | | | | | | | smoker=Yes +----------------+ +---------------+ +--------+ +--------+ smoker=No|day=Thur smoker=No|day=Fri +--------+ +--------+ +----------------+ +---------------+ | | | | smoker=No | | | | +--------+ +--------+ +----------------+ +---------------+`
set_titles() uchun mavjud o'rin egallovchilar: {col_name}, {row_name}, {col_var}, {row_var}. Demak g.set_titles("{col_var} = {col_name}") bitta o'zgaruvchili facet uchun default holatni qayta hosil qiladi.
Facet tartibi va colour ni boshqarish
g = sns.catplot(data=tips, x="sex", y="tip", col="day", kind="bar", col_order=["Thur", "Fri", "Sat", "Sun"], # panel larning aniq tartibi hue="smoker", hue_order=["No", "Yes"], palette="Set2", height=3) # FacetGrid ham xuddi shu tartiblash argumentlarini qabul qiladi g = sns.FacetGrid(tips, col="day", col_order=["Fri", "Sat", "Sun", "Thur"], hue="time", hue_order=["Lunch", "Dinner"], height=2.8)
Agar faceting uchun ishlatilayotgan column tartibga ega pandas Categorical bo'lsa, seaborn shu tartibni hurmat qiladi. Aks holda object dtype uchun daraja lar birinchi uchrash tartibida, raqamli dtype uchun esa saralangan holda chiqadi. col_order ni aniq ko'rsatish — bunga ishonch hosil qilishning yagona yo'li, va u bir vaqtning o'zida ba'zi daraja larni yozmaslik orqali ularni tashlab yuborish imkonini ham beradi.
20.4 pairplot: har bir o'zgaruvchi barcha qolganlariga qarshi
sns.pairplot() ikki o'zgaruvchili grafikalar matritsasini chizadi: k ta raqamli column ga ega dataset uchun u k × k grid hosil qiladi, unda (i, j) katakcha i column ni j column ga qarshi ko'rsatadi. Bu yangi raqamli dataset ning shaklini ko'rishning eng tez yo'li.
penguins = sns.load_dataset("penguins") g = sns.pairplot(penguins) # barcha raqamli column lar g = sns.pairplot(penguins, hue="species") # guruh bo'yicha rang berish
Har bir numeric o‘zgaruvchi boshqasiga qarshi, diagonalda esa taqsimotlar. Ko‘pincha aynan shu bitta grafik butun boshlang‘ich EDA ni tashkil qiladi.
`pairplot(penguins, vars=["bill_length_mm", "bill_depth_mm", "flipper_length_mm"])
bill_len bill_depth flipper +-----------+ +-----------+ +-----------+ bill_len | /\ hist | | scatter | | scatter | +-----------+ +-----------+ +-----------+ bill_depth| scatter | | /\ hist | | scatter | +-----------+ +-----------+ +-----------+ flipper | scatter | | scatter | | /\ hist | +-----------+ +-----------+ +-----------+ diagonal = bir o'zgaruvchili; off-diagonal undan aks etadi`
Nega diagonal da distribution turadi
(i, i) katakcha o'zgaruvchini o'ziga qarshi chizgan bo'lardi. Bu esa doim 45° burchakdagi mukammal to'g'ri chiziq, har qanday dataset uchun bir xil, demak hech qanday ma'lumot bermaydi. Seaborn bu joyni foydaliroq narsaga sarflaydi: o'sha o'zgaruvchining bir o'zgaruvchili distribution i — default bo'yicha histogram, so'rasangiz KDE.
Nega corner=True siyohni ikki barobar kamaytiradi
(i, j) katakcha va (j, i) katakcha bir xil ikki o'zgaruvchini, faqat axes lari almashtirilgan holda ko'rsatadi. Ular ko'zgu tasvirlari: yangi ma'lumot yo'q, shunchaki aks. corner=True yuqori uchburchakni olib tashlaydi va quyi uchburchakli matritsani qoldiradi. Oltita o'zgaruvchi uchun bu 36 ta panel ni 21 taga tushiradi va omon qolgan har bir panel ko'proq joy oladi.
g = sns.pairplot(penguins, hue="species", corner=True)
corner=False (k=4 -> 16 ta panel) corner=True (k=4 -> 10 ta panel)
+--+ +--+ +--+ +--+ +--+
+--+ +--+ +--+ +--+ +--+ +--+
+--+ +--+ +--+ +--+ +--+ +--+ +--+
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
Bilib qo'yishga arziydigan parametrlar
ParametrQiymatlarTa'siri
varscolumn nomlari ro'yxatiMatritsani shu column lar bilan cheklaydi — eng muhim argument
x_vars, y_varsro'yxatlarTo'rtburchak, kvadrat bo'lmagan matritsa (masalan 3 ta predictor 1 ta target ga qarshi)
huecolumn nomiGuruh bo'yicha rang; shuningdek diagonal ni har bir guruhning distribution iga ajratadi
kind``"scatter", "kde", "hist", "reg"Diagonal dan tashqarida ishlatiladigan mark
diag_kind``"auto", "hist", "kde", NoneDiagonal dagi mark; "auto" degani hue berilganda KDE, aks holda histogram
corner``True/FalseOrtiqcha yuqori uchburchakni olib tashlaydi
markersstr yoki ro'yxatHar bir hue darajasi uchun marker shakli — bosma nashr va rangni ajrata olmaydigan o'quvchilar uchun foydali
plot_kws, diag_kwsdictDiagonal dan tashqaridagi / diagonal dagi function larga uzatiladigan keyword lar
height, aspectfloatHar bir katakchaning o'lchami
dropnaboolYetishmayotgan qiymatlarni tashlaydi (zamonaviy versiyalarda bu har bir grafika uchun alohida ishlaydi)
# o'zgaruvchilarni cheklaymiz va mark larni shakllantiramiz g = sns.pairplot( penguins, vars=["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"], hue="species", diag_kind="kde", corner=True, markers=["o", "s", "D"], plot_kws={"alpha": 0.6, "s": 25, "edgecolor": "none"}, diag_kws={"fill": True, "common_norm": False}, height=2.0, ) # to'rtburchak matritsa: uchta predictor bitta natijaga qarshi g = sns.pairplot(penguins, x_vars=["bill_length_mm", "bill_depth_mm", "flipper_length_mm"], y_vars=["body_mass_g"], hue="sex", height=3, aspect=0.9) # har bir katakchada regression — chiziqli tuzilmani tez topish uchun qulay iris = sns.load_dataset("iris") g = sns.pairplot(iris, kind="reg", diag_kind="hist", plot_kws={"line_kws": {"color": "crimson"}}) # qator juda ko'p bo'lib nuqtalar orasidan ko'rinmay qolsa, nuqta o'rniga density g = sns.pairplot(iris, kind="kde", corner=True)
sns.pairplot(df.select_dtypes("number").sample(min(len(df), 2000)), corner=True). Raqamli column lar bilan cheklash kutilmagan holatlarning oldini oladi, sampling tezlikni saqlaydi, corner=True esa o'qishni osonlashtiradi. Keyin qiziq ko'ringan narsaga vars= bilan yaqinlashing.
20.5 PairGrid: matritsa ustidan to'liq nazorat
pairplot() — bu PairGrid ustidagi wrapper bo'lib, u har bir sohani bitta mark bilan to'ldiradi. PairGrid esa yuqori uchburchak, quyi uchburchak va diagonal uchun har xil mark tanlash imkonini beradi — aynan shu yo'l bilan siz simmetrik va yarmi behuda ketgan matritsa o'rniga ma'lumotga to'la matritsa olasiz.
| Metod | To'ldiriladigan soha |
|---|---|
g.map(func, **kws) |
Har bir katakcha, diagonal ham qo'shilgan holda |
g.map_diag(func, **kws) |
Faqat diagonal |
g.map_offdiag(func, **kws) |
Diagonal dan tashqari hamma joy |
g.map_upper(func, **kws) |
Faqat yuqori uchburchak |
g.map_lower(func, **kws) |
Faqat quyi uchburchak |
g = sns.PairGrid(penguins, vars=["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"], hue="species", height=2.0, diag_sharey=False) g.map_upper(sns.scatterplot, s=15, alpha=0.6) # tepada nuqtalar g.map_lower(sns.kdeplot, levels=4, linewidths=1) # pastda konturlar g.map_diag(sns.histplot, kde=True, element="step") g.add_legend(title="Species")
PairGrid to‘liq nazorat beradi: diagonaldan yuqorida xom nuqtalar, pastda silliqlangan zichlik, diagonalda esa taqsimotlar.
v1 v2 v3
+--------+ +------+ +------+
v1 | hist | |scatter| |scatter| <- upper: xom points
+--------+ +------+ +------+
v2 | kde | | hist | |scatter|
+--------+ +------+ +------+
v3 | kde | | kde | | hist | <- lower: silliqlangan density
+--------+ +------+ +------+
diagonal: bir o'zgaruvchili
Yuqori uchburchakda custom xulosa
map_upper istalgan function ni qabul qilgani uchun, keng tarqalgan professional pattern — ortiqcha scatter turgan joyga raqamli correlation ni qo'yish.
import numpy as np def annotate_corr(x, y, **kws): ax = plt.gca() ok = np.isfinite(x) & np.isfinite(y) # avval NaN juftliklarni tashlaymiz r = np.corrcoef(x[ok], y[ok])[0, 1] ax.set_axis_off() ax.text(0.5, 0.5, f"r = {r:.2f}", ha="center", va="center", fontsize=13, transform=ax.transAxes) g = sns.PairGrid(penguins.dropna(), vars=["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"], height=1.9) g.map_lower(sns.scatterplot, s=12, alpha=0.5) g.map_diag(sns.histplot, color="0.4") g.map_upper(annotate_corr)
Diagonal panel lar o'zgaruvchining o'z masshtabini emas, balki count yoki density ni ko'rsatadi, shuning uchun y-axis ni scatter qatorlari bilan bo'lishish ularni siqib qo'yadi. PairGrid(..., diag_sharey=False) ularni ozod qiladi. pairplot() buni siz uchun o'zi sozlaydi; qo'lda qurilgan PairGrid esa sozlamaydi.
20.6 jointplot: bog'liqlik va uning chetlari
Ikki o'zgaruvchining scatter i ularning birgalikdagi xatti-harakati haqida ma'lumot beradi, lekin har bir o'zgaruvchining o'z distribution ini yashiradi. sns.jointplot() ikki o'zgaruvchili grafikani katta markaziy panel ga joylaydi, har bir o'zgaruvchining bir o'zgaruvchili grafikasini esa mos chetdagi ingichka panel ga qo'yadi.
g = sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species", height=5)
jointplot asosiy grafikni ikkala o‘qdagi marginal taqsimotlar bilan birlashtiradi. kind ni data zichligiga qarab tanlang — hex overplotting ni scatter dan ancha yaxshi hal qiladi.
+--------------------+
| marginal x | <- x bo'yicha distribution
+--------------------+
+---+ +--------------------+
| m | | |
| a | | joint plot |
| r | | (asosiy axes) |
| g | | |
| y | +--------------------+
+---+
^ y bo'yicha distribution, 90 daraja burilgan
kind= variantlari
kindMarkaziy panelNima uchun eng mos
"scatter" (default)scatterplotKichik va o'rtacha n; har bir nuqta ko'rinadi
"kde"``kdeplot konturlariDensity shaklini ko'rsatish; silliq, uzluksiz ma'lumot
"hist"2 o'lchovli histogram (to'rtburchak bin lar)Nuqtalar ustma-ust tushadigan katta n
"hex"Olti burchakli binningKatta n; olti burchaklar kvadrat grid dagi ko'rish artefaktlarisiz qoplaydi
"reg"``regplot: scatter + moslashtirilgan chiziq + CIChiziqli bog'liqlikni baholash
"resid"``residplot: chiziqli moslashtirishdan qolgan residual larChiziqli moslashtirish yetarlimi yoki yo'qmi, shuni tekshirish
tips = sns.load_dataset("tips") sns.jointplot(data=tips, x="total_bill", y="tip", kind="reg", height=5, marginal_kws={"bins": 25, "fill": True}) sns.jointplot(data=tips, x="total_bill", y="tip", kind="hex", color="#4c72b0", height=5) sns.jointplot(data=penguins, x="flipper_length_mm", y="body_mass_g", kind="kde", fill=True, thresh=0.05, levels=8, height=5) sns.jointplot(data=tips, x="total_bill", y="tip", kind="resid", height=5)
Har bir qatlamga keyword uzatish
jointplot ikki xil narsani chizadi, shuning uchun unga ikkita keyword kanali kerak.
| Argument | Qayerga boradi |
|---|---|
Yuqori darajadagi keyword lar (alpha=, s=, …) |
Joint (markaziy) chizish function iga |
joint_kws={...} |
Joint chizish function iga, aniq ko'rsatilgan holda |
marginal_kws={...} |
Ikkala marginal chizish function iga |
ratio= |
Joint axes o'lchami ÷ marginal axes o'lchami (default 5) |
space= |
Joint va marginal axes orasidagi bo'shliq, dyuymda |
marginal_ticks= |
True marginal larda count/density tick larini ko'rsatadi |
g = sns.jointplot( data=penguins, x="flipper_length_mm", y="body_mass_g", hue="species", kind="scatter", height=5.5, ratio=4, space=0.15, joint_kws={"s": 28, "alpha": 0.7, "edgecolor": "none"}, marginal_kws={"fill": True, "common_norm": False, "alpha": 0.4}, )
hue= "scatter", "kde" va "hist" bilan ishlaydi. Lekin u "reg", "resid" yoki "hex" bilan ishlamaydi, chunki hexbin da count uchun bitta rang shkalasi bo'ladi, regression esa bitta model ni moslashtiradi. Agar sizga chetlari bilan birga guruhlangan regression kerak bo'lsa, JointGrid quring va sns.lmplot uslubidagi mantiqni o'zingiz yozing, yoki chetlarsiz lmplot(hue=...) dan foydalaning.
20.7 JointGrid: uchala panel ustidan to'liq nazorat
JointGrid uchta bo'sh axes yaratadi va ularni mustaqil ravishda to'ldirish imkonini beradi. Uslub PairGrid nikiga o'xshaydi.
| Element | Ma'nosi |
|---|---|
g.plot_joint(func, **kws) |
Markaziy axes ga chizadi |
g.plot_marginals(func, **kws) |
Ikkala marginal axes ga chizadi |
g.plot(joint_func, marginal_func) |
Ikkalasini birdaniga bajarish uchun qisqartma |
g.ax_joint |
Markaziy Axes |
g.ax_marg_x, g.ax_marg_y |
Yuqoridagi va o'ngdagi Axes |
g.refline(x=..., y=...) |
Joint va marginal axes bo'ylab reference chiziqlar |
g = sns.JointGrid(data=penguins, x="flipper_length_mm", y="body_mass_g", hue="species", height=5.5, ratio=4) g.plot_joint(sns.scatterplot, s=30, alpha=0.7) g.plot_marginals(sns.boxplot) # histogram o'rniga box lar g.refline(x=200, y=4000) # uchala panel da ham reference chiziqlar g.set_axis_labels("Flipper length (mm)", "Body mass (g)") # joint panel da ikkita mark ni qatlamlash — jointplot bilan bu imkonsiz g = sns.JointGrid(data=tips, x="total_bill", y="tip", height=5) g.plot_joint(sns.kdeplot, fill=True, cmap="Blues", levels=8, thresh=0.05) g.plot_joint(sns.scatterplot, s=14, color="0.2", alpha=0.5) g.plot_marginals(sns.histplot, kde=True, color="0.4") # ikkala chetda turli mark lar, axes obyektlari orqali g = sns.JointGrid(data=tips, x="total_bill", y="tip", height=5) g.plot_joint(sns.scatterplot, s=18) sns.histplot(data=tips, x="total_bill", ax=g.ax_marg_x, bins=25, color="0.5") sns.boxplot(data=tips, y="tip", ax=g.ax_marg_y, color="0.8", width=0.4)
jointplot = markazda bitta mark, chetlarda bitta xil grafika, kind= orqali tanlanadi. JointGrid = mustaqil murojaat qilinadigan uchta panel ning har birida xohlagancha qatlam. Qatlamlash kerak bo'lgan zahoti grid ga qo'l uzating.20.8 Qaytarilgan grid obyektini sozlash
Har bir figure-level function grid qaytaradi va siz uni o'zgaruvchiga o'zlashtirishingiz kerak — odatda g ga. Grid — bu butun figure ustidagi dastagingiz, va uning metodlari zanjir bo'lib ulanadi, chunki har biri self ni qaytaradi.
| Chaqiruv | Ta'siri |
|---|---|
g.figure |
Asosidagi matplotlib Figure (g.figure.suptitle(...) ishlating) |
g.axes |
Axes massivi; row×col grid uchun 2 o'lchovli, col_wrap ishlatilganda 1 o'lchovli |
g.axes_dict |
Facet qiymati kalit bo'lgan dict — g.axes_dict["Sat"] yoki g.axes_dict[("Yes", "Sat")] |
g.set_axis_labels(x, y) |
Tashqi axes larga bir marta yorliq qo'yadi, har bir panel ga emas |
g.set_titles(template) |
Har bir facet ga shablondan sarlavha qo'yadi |
g.set(xlim=, ylim=, xscale=, ...) |
Istalgan Axes.set() keyword ini har bir panel ga qo'llaydi |
g.set_xticklabels(...) / g.set_yticklabels(...) |
Har bir panel dagi tick yorliqlari (rotation= ni qabul qiladi) |
g.despine(left=True) |
Grid bo'ylab spine larni olib tashlaydi |
g.add_legend(title=..., bbox_to_anchor=...) |
Umumiy legend ni qo'shadi yoki joyini o'zgartiradi |
g.tight_layout() |
Ustma-ust tushgan yorliq va sarlavhalarni tartibga soladi |
g.savefig(path, dpi=..., bbox_inches="tight") |
Butun figure ni saqlaydi |
g.refline(x=, y=) |
Har bir facet da reference chiziq (FacetGrid, JointGrid) |
g = sns.relplot(data=tips, x="total_bill", y="tip", col="day", col_wrap=2, hue="sex", height=3, aspect=1.1) g.set_axis_labels("Total bill ($)", "Tip ($)") g.set_titles("{col_name}") g.set(xlim=(0, 60), ylim=(0, 12)) g.despine(left=False) g.refline(y=tips["tip"].mean()) g.figure.suptitle("Tipping behaviour by day of week", y=1.03, fontsize=14) g.tight_layout() g.savefig("tips_by_day.png", dpi=200, bbox_inches="tight")
Aniq bitta panel ga murojaat qilish
g = sns.relplot(data=tips, x="total_bill", y="tip", col="day", row="smoker", height=2.5) # pozitsiya bo'yicha: axes — bu Axes lardan iborat 2 o'lchovli numpy massiv g.axes[0, 2].set_facecolor("#fff3cd") # nom bo'yicha: ancha o'qishli va tartib o'zgarsa ham buzilmaydi ax = g.axes_dict[("Yes", "Sat")] ax.annotate("busiest service", xy=(40, 8), fontsize=9) # har bir panel ni kaliti bilan birga aylanib chiqamiz for (smoker, day), ax in g.axes_dict.items(): ax.grid(True, alpha=0.3) if day == "Sun": ax.set_facecolor("#f5f5f5") # col_wrap bilan axes 1 o'lchovli bo'ladi — ikkala holatda ham xavfsiz bo'lishi uchun axes.flat ishlating g2 = sns.relplot(data=tips, x="total_bill", y="tip", col="day", col_wrap=2) for ax in g2.axes.flat: ax.axhline(3, color="0.6", ls=":", lw=1)
col_order ni o'zgartirsangiz yoki row= qo'shsangiz, pozitsion indekslash o'sha zahoti buziladi. g.axes_dict esa facet qiymati bo'yicha kalitlanadi (row va col ikkalasi ham berilganda kalit tuple bo'ladi), shuning uchun kod siz nazarda tutgan narsani aytishda davom etadi.
Metodlarni zanjirlash
g = (sns.catplot(data=titanic, x="class", y="age", col="sex", kind="violin", height=3.5) .set_axis_labels("Passenger class", "Age (years)") .set_titles("{col_name}") .set(ylim=(0, 80)) .despine(left=True)) g.figure.suptitle("Age distribution by class and sex", y=1.04)
20.9 Tuzoqlar
plt.title() faqat oxirgi subplot ga sarlavha qo'yadi
Bu grid bilan bog'liq eng ko'p uchraydigan xato. plt.title() matplotlib ning joriy axes iga ta'sir qiladi, figure-level chaqiruvdan keyin esa joriy axes — oxirgi chizilgan panel, odatda o'ng pastdagisi. Natijada sarlavhangiz butun figure ustida emas, bitta kichik panel da paydo bo'ladi.
# NOTO'G'RI — sarlavha faqat oxirgi facet ga tushadi sns.relplot(data=tips, x="total_bill", y="tip", col="day", col_wrap=2) plt.title("Tips by day") # TO'G'RI — figure ga grid orqali sarlavha qo'yamiz g = sns.relplot(data=tips, x="total_bill", y="tip", col="day", col_wrap=2) g.figure.suptitle("Tips by day", y=1.03) g.tight_layout()
Xuddi shu narsa plt.xlabel(), plt.ylabel(), plt.xlim() va ularga o'xshashlarga ham tegishli: grid da g.set_axis_labels() va g.set(xlim=...) dan foydalaning, chunki ular har bir panel ga ta'sir qiladi.
Default bo'yicha suptitle figure ichiga joylashtiriladi va yuqori qatordagi facet sarlavhalari bilan to'qnashib qolishi mumkin. y=1.02 yoki 1.03 uzatilsa, u figure ramkasidan sal yuqoriga ko'tariladi; keyin g.tight_layout() ni chaqiring va bbox_inches="tight" bilan saqlang, aks holda ko'tarilgan sarlavha faylda kesilib qoladi.
Figure-level function lar plt.figure(figsize=...) ni e'tiborsiz qoldiradi
# NOTO'G'RI — bu yerda yaratilgan figure tashlab yuboriladi; relplot o'zinikini yaratadi plt.figure(figsize=(14, 6)) sns.relplot(data=tips, x="total_bill", y="tip", col="day") # TO'G'RI — facet larning o'lchamini belgilaymiz g = sns.relplot(data=tips, x="total_bill", y="tip", col="day", height=3, aspect=1.2) # jami ≈ 14.4 x 3 dyuym # OXIRGI CHORA — chizilgandan keyin o'lchamni o'zgartirish g.figure.set_size_inches(14, 6)
Bu xatodan keyin notebook da ko'pincha bo'sh qo'shimcha figure paydo bo'lganini ko'rasiz — bu tashlab yuborilgan plt.figure().
g.fig eskirgan; g.figure ishlating
Seaborn 0.11 va undan oldingi versiyalar matplotlib figure ni g.fig sifatida ochib bergan. 0.11.2 dan boshlab bu atribut g.figure deb ataladi — matplotlib ning o'z nomlanishiga mos holda — va g.fig eskirganlik ogohlantirishini chiqaradi. Eski darsliklar g.fig.suptitle(...) bilan to'la; siz esa g.figure.suptitle(...) deb yozing.
Keng DataFrame da pairplot: n² portlashi
k ta raqamli column ning pairplot i k² ta panel chizadi. Yigirmata column — bu 400 ta panel: bir necha daqiqa render, megabaytlab natija va hech nima o'qib bo'lmaydi.
| Raqamli column lar | Panel lar (to'liq) | Panel lar (corner=True) |
Xulosa |
|---|---|---|---|
| 4 | 16 | 10 | Ideal |
| 8 | 64 | 36 | Tor bo'la boshladi |
| 15 | 225 | 120 | O'qib bo'lmaydi |
| 40 | 1600 | 820 | Urinib ham ko'rmang |
# o'zgaruvchilarni ongli tanlang — masalan target bilan eng kuchli bog'liqlari num = penguins.select_dtypes("number") top = num.corr()["body_mass_g"].abs().sort_values(ascending=False).index[:5] g = sns.pairplot(penguins, vars=list(top), hue="species", corner=True, height=1.9)
Raqamli column lar taxminan sakkiztadan ko'p bo'lsa, avval sns.heatmap(df.corr(numeric_only=True)) bilan qiziq juftliklarni toping, keyin faqat o'shalar uchun pairplot chizing. Heatmap ning o'qishliligi chiziqli kamayadi, pairplot niki esa kvadratik.
pairplot column va qatorlarni indamay tashlab yuboradi
Hech narsa chizilishidan oldin ikkita ovozsiz filtr ishlaydi:
- Raqamli bo'lmagan column lar matritsadan chiqarib tashlanadi. O'nta column dan oltitasi matn bo'lgan dataset 4×4 grid hosil qiladi va hech qanday ogohlantirish bermaydi. Agar kutgan column ingiz yo'q bo'lsa, uning dtype ini tekshiring — adashib qolgan
"N/A"tufayliobjectsifatida o'qilgan raqamli column shunchaki yo'qoladi. - Yetishmayotgan qiymatli qatorlar ular ta'sir qiladigan katakchalar uchun tashlab yuboriladi.
penguinsdasexcolumn ida NaN lar bor;pairplot(penguins, hue="sex")indamaylen(penguins)dan kamroq qatorni tahlil qiladi.
# filtrlashni ovozsiz emas, oshkora qilamiz print(penguins.dtypes) print(penguins.isna().sum()) clean = penguins.dropna(subset=["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g", "species"]) print(f"{len(penguins)} rows -> {len(clean)} rows used") g = sns.pairplot(clean, hue="species", corner=True)
species object island object bill_length_mm float64 bill_depth_mm float64 flipper_length_mm float64 body_mass_g float64 sex object dtype: object species 0 island 0 bill_length_mm 2 bill_depth_mm 2 flipper_length_mm 2 body_mass_g 2 sex 11 dtype: int64 344 rows -> 342 rows used
sharey tuzog'i, ikkala tomonga ham
Axis sharing — bu solishtirish mumkinligi haqidagi da'vo, va ikkala sozlama ham yolg'on gapira oladi.
| Sozlama | Xavfi | Qachon to'g'ri |
|---|---|---|
sharey=True (default) |
Diapazoni tor facet pastda siqilgan tekis chiziqqa aylanadi; facet ichidagi haqiqiy tuzilma yo'qoladi | Panel lar bir xil kattalikni o'lchaydi va siz daraja larni solishtirmoqchisiz |
sharey=False |
Har bir panel o'z ramkasini to'ldirish uchun qayta masshtablanadi, shuning uchun juda farq qiladigan guruhlar bir xil ko'rinadi; o'quvchi solishtirib bo'lmaydigan masshtablardagi shakllarni solishtiradi | Panel lar turli kattaliklarni o'lchaydi, yoki faqat panel ichidagi shakl muhim |
sharey=False qo'yganingizda masshtab lar farq qilishini bildiruvchi yagona belgi — axis dagi tick yorliqlari, o'quvchilar esa tick yorliqlarini o'qimay o'tib ketadi. Buni sarlavhaga yoki izohga qo'shing: "eslatma: y-axis har bir panel da mustaqil masshtablangan". Diqqatli o'quvchini chalg'itadigan grafika umuman grafika yo'qligidan ham yomonroq.
Facet lar juda ko'p
Kardinalligi yuqori column bo'yicha faceting — mijoz ID si, shahar, mahsulot SKU si — yuzlab poch marka kattaligidagi panel hosil qiladi. Yechimlar, afzallik tartibida: o'zgaruvchini bir nechta ma'noli daraja ga jamlash; eng yuqori n ta daraja ni qoldirib, qolganini "Other" ga yig'ish; col_wrap ni kichikroq height bilan ishlatish; yoki faceting dan voz kechib, shaffoflik bilan hue dan foydalanish.
# faceting dan oldin uzun quyruqni yig'ib olamiz top5 = tips["size"].value_counts().index[:5] sub = tips[tips["size"].isin(top5)] g = sns.catplot(data=sub, x="day", y="tip", col="size", kind="box", col_wrap=3, height=2.4)
tight_layout() siz ustma-ust tushgan yorliqlar
Uzun tick yorliqlari, burilgan yorliqlar yoki ko'tarilgan suptitle qo'shni panel lar bilan to'qnashadi. Ko'rsatish yoki saqlashdan oldingi oxirgi qadam sifatida g.tight_layout() ni chaqiring.
g = sns.catplot(data=titanic, x="embark_town", y="fare", col="class", kind="bar", height=3.2) g.set_xticklabels(rotation=45, ha="right") g.set_axis_labels("Port of embarkation", "Fare (£)") g.figure.suptitle("Fare by port and class", y=1.04) g.tight_layout()
sns.load_dataset() uchun internet kerak
sns.load_dataset("tips") GitHub dagi seaborn-data repozitoriysidan CSV yuklab oladi. Offline holatda — cheklangan laboratoriya kompyuteri, imtihon xonasi, tarmoqdan uzilgan muhit — u URL yoki timeout xatosini chiqaradi va bu bobdagi har bir misol birinchi qatordayoq ishlamay qoladi.
# bir marta, hali internet bor ekan: CSV larni lokal keshlab qo'ying import seaborn as sns, os os.makedirs("seaborn-data", exist_ok=True) for name in ["tips", "penguins", "iris", "titanic"]: sns.load_dataset(name).to_csv(f"seaborn-data/{name}.csv", index=False) # keyin, offline holatda: seaborn ni kesh ga yo'naltiring import seaborn as sns sns.load_dataset("tips", data_home="seaborn-data", cache=True) # yoki seaborn ni butunlay chetlab o'ting — har bir funksiya istalgan DataFrame ni qabul qiladi import pandas as pd tips = pd.read_csv("seaborn-data/tips.csv") sns.relplot(data=tips, x="total_bill", y="tip", col="day", col_wrap=2)
load_dataset() — bu o'qitish uchun qulaylik, chizish API sining bir qismi emas. Istalgan pandas.DataFrame xuddi shunday ishlaydi. To'rtta CSV ni bir marta keshlab qo'ysangiz, butun qo'llanma offline ishlaydi.
Yana ikkita kichik narsa
- Legend ikki marta chizilishi. Figure-level function qaytargan grid da
g.add_legend()ni chaqirish ikkinchi legend qo'shadi, chunki bittasi allaqachon mavjud. Uning o'rnigag.legend.set_title(...)yokig.legend.remove()dan foydalaning. col_wrapsiz kutgan y-axis sharing xatti-harakatini o'chiradi.col_wrapbilan seaborn tashqi yorliqlar uchun matplotlib ning odatdagi row/column sharing mexanizmidan foydalana olmaydi, shuning uchun tick yorliqlari haqiqiy grid dagidan ko'proq panel da paydo bo'ladi. Bu faqat tashqi ko'rinishga tegishli, lekin aynan shu sababdan buklangan grid ancha shovqinli ko'rinadi.
20.10 Mashqlar to'plami
# Bularni notebook ingizning boshida bir marta yuklang. import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") penguins = sns.load_dataset("penguins") iris = sns.load_dataset("iris") titanic = sns.load_dataset("titanic") # 1. FIGURE VA AXES # total_bill va tip scatter ini ikki marta chizing: birinchisini o'zingiz # yaratgan 1x2 matplotlib figure ning chap panel iga sns.scatterplot bilan, # ikkinchisini sns.relplot bilan. Har biri nima qaytarganini type() bilan # chop eting va nega faqat bittasi ax= ni qabul qilganini izohlab bering. # 2. SMALL MULTIPLES # tips scatter ini day (col=) va smoker (row=) bo'yicha facet qiling, rangni # sex bo'yicha bering. Keyin xuddi shu ma'lumotni faqat hue va style bilan # BITTA panel da chizing. Qaysi biri o'qishga oson va nega — ikki gapda yozing. # 3. COL_WRAP VA O'LCHAM # displot bilan penguin flipper_length_mm distribution larini island VA sex # bo'yicha facet qiling. Har bir facet 2.5 dyuym balandlikda va 1.3 barobar # keng bo'lsin. Keyin buni col="species" va col_wrap=2 bilan qayta bajaring. # 4. QO'LDA QURILGAN FACETGRID # tips ustida col="day", col_wrap=2 bilan FacetGrid quring. (a) total_bill va # tip ni scatter qiladigan, (b) 15% uchun uzuq-uzuq reference chiziq # chizadigan, (c) panel ning o'rtacha tip foizini chap yuqori burchakka # yozadigan custom funksiya map qiling. Axis yorliqlari va sarlavha qo'shing. # 5. PAIRPLOT INTIZOMI # sns.pairplot(penguins) ni boshqa argumentsiz ishga tushiring va panel # larni sanang. Keyin faqat to'rtta tana o'lchovi column i uchun corner # pairplot chizing: species bo'yicha hue, diagonal da KDE, alpha 0.6. # Yetishmayotgan qiymatlar tufayli nechta qator tashlanganini yozing. # 6. PAIRGRID SOHALARI # iris dataset ida PairGrid quring: quyi uchburchakda scatter, yuqori # uchburchakda KDE kontur lari, diagonal da histogram bo'lsin, hammasi # species bo'yicha ranglangan holda. "Species" sarlavhali legend qo'shing. # 7. JOINTPLOT VA JOINTGRID # total_bill va tip ni jointplot bilan to'rt xil chizing: scatter, hex, # kde, reg. Keyin kde variantini JointGrid bilan qayta hosil qiling: # kontur lar ustiga scatter qatlamini va ikkala chetga box plot qo'shing. # 8. BUZUQ GRAFIKANI TUZATING # Quyidagi kodda to'rtta xato bor. Hammasini toping va tuzating. # plt.figure(figsize=(12, 4)) # g = sns.catplot(data=titanic, x="sex", y="fare", col="class", # row="embark_town", col_wrap=2, kind="bar", # sharey=False) # plt.title("Fare by class") # g.fig.savefig("out.png")
20.11 Intervyu savollari
S: Seaborn da axes-level va figure-level function o'rtasidagi farq nima va qaysi biri qaysiligini qanday aniqlaysiz?
Axes-level function (scatterplot, boxplot, histplot, regplot) bitta matplotlib Axes ustiga chizadi, ax= ni qabul qiladi va o'sha Axes ni qaytaradi. Figure-level function (relplot, catplot, displot, lmplot, pairplot, jointplot) butun Figure ni yaratadi va uni o'z ixtiyorida saqlaydi, col=/row= faceting ni qo'llab-quvvatlaydi, panel lardan tashqarida bitta legend joylashtiradi, figsize= emas height=/aspect= bilan o'lchanadi va FacetGrid, PairGrid yoki JointGrid qaytaradi. Amalda: agar ax= ni qabul qilsa, u axes-level. Figure-level function lar — bu kind= orqali axes-level function larga murojaat qiladigan wrapper lar.
S: Bitta figure da scatter va box plot ni yonma-yon qo'ymoqchisiz. Qaysi seaborn function laridan foydalanasiz va nega relplot bilan catplot emas?
Axes-level juftlikdan foydalaning: fig, axes = plt.subplots(1, 2), keyin sns.scatterplot(..., ax=axes[0]) va sns.boxplot(..., ax=axes[1]). relplot va catplot ning har biri o'z figure ini yaratadi va ularda ax= parametri yo'q, shuning uchun ikkalasini chaqirsangiz ikkita alohida figure hosil bo'ladi. Figure-level function larni umumiy layout ga birlashtirib bo'lmaydi; bu — ular beradigan faceting va legend boshqaruvi evaziga to'lanadigan narx.
S: Hamkasbingiz to'rtta facet li relplot dan keyin plt.title("...") yozdi va sarlavha bitta kichik panel da paydo bo'ldi. Sababini tushuntiring va tuzating.
plt.title() matplotlib ning joriy axes iga ta'sir qiladi, facet li chaqiruvdan keyin esa bu — oxirgi chizilgan panel. Figure da to'rtta axes bor, pyplot ning holati esa ulardan bittasiga ishora qilib turadi. Yechim — sarlavhani qaytarilgan grid orqali figure ga qo'yish: g.figure.suptitle("...", y=1.02), keyin g.tight_layout(). Diqqat qiling: eskirgan g.fig emas, g.figure. Xuddi shu mantiq plt.xlabel/plt.xlim ga ham tegishli — ular o'rniga g.set_axis_labels() va g.set(xlim=...) ishlatiladi.
S: Nega pairplot ning diagonal i distribution ni ko'rsatadi va corner=True nima qiladi?
Diagonal katakcha o'zgaruvchini o'ziga qarshi chizgan bo'lardi, bu esa doim aynanlik chizig'i bo'lib, hech qanday ma'lumot bermaydi; shuning uchun seaborn bu joyni o'zgaruvchining bir o'zgaruvchili distribution i uchun ishlatadi (histogram, yoki hue berilganda KDE). corner=True yuqori uchburchakni olib tashlaydi: (i, j) va (j, i) katakchalar bir xil juftlikni axes lari almashtirilgan holda ko'rsatadi, ya'ni matritsaning yarmi ko'zgu tasviri. Uni olib tashlash k² ta panel ni k(k+1)/2 taga tushiradi, render vaqtini qisqartiradi va qolgan har bir panel ga ko'proq joy beradi.
S: Qachon relplot yoki catplot o'rniga FacetGrid ni qo'lda qurasiz?
Qachonki sizga bu wrapper lar bermaydigan narsa kerak bo'lsa: ularning kind= ro'yxatida yo'q mark (jumladan oddiy matplotlib function i yoki uchinchi tomon chizish chaqiruvi); har bir panel da ikki yoki undan ko'p qatlam; yoki o'sha facet ning qismidan hisoblangan izoh — masalan n, R², guruh o'rtachasi yoki reference chiziq. Uslub shunday: g = sns.FacetGrid(df, col=..., row=...), keyin g.map_dataframe(my_func, ...), keyin g.add_legend() — qo'lda qurilgan grid da legend avtomatik qo'shilmaydi.
S: g.map() va g.map_dataframe() o'rtasidagi farq nima?
map() nomlangan column larni pozitsion vektorlar sifatida uzatadi: funksiyangiz xom massivlarni oladi. map_dataframe() esa facet ning qismini data= sifatida va column nomlarini keyword argumentlar sifatida uzatadi, shuning uchun function o'sha qismdagi istalgan column ga murojaat qila oladi — nafaqat siz nomlaganlariga. Zamonaviy seaborn function lari va qo'shimcha column talab qiladigan custom function lar (masalan panel bo'yicha statistika yoki ikkinchi darajali guruhlash uchun) map_dataframe() ni talab qiladi.
S: Facet lar bo'ylab sharey=True va sharey=False ning farqi hamda har birining xavfi nimada?
sharey=True (default) barcha panel larni bitta masshtabga qo'yadi, shuning uchun pozitsiyalarni bevosita solishtirish mumkin — small multiples ni ishlatadigan narsa aynan shu. Xavfi shundaki, diapazoni tor facet tekislanib qoladi va uning ichki tuzilmasi yo'qoladi. sharey=False har bir panel ni o'z ma'lumotiga qayta masshtablaydi va panel ichidagi shaklni ochib beradi, lekin kattaliklari juda farq qiladigan guruhlarni bir xil ko'rsatib, faol ravishda chalg'itadi. Shared bo'lmagan axes ni faqat panel lar daraja bo'yicha solishtirilishi ko'zda tutilmaganda ishlating va buni sarlavhada yoki izohda aytib qo'ying. Figure-level function larda bu sozlama facet_kws={"sharey": False} ichiga yoziladi.
S: Qaytarilgan grid ichidagi bitta subplot ga qanday murojaat qilib, uni o'zgartirasiz?
g.axes yoki g.axes_dict orqali. g.axes — bu Axes lardan iborat numpy massiv: row×col grid uchun 2 o'lchovli, col_wrap ishlatilganda 1 o'lchovli, shuning uchun aylanib chiqishning xavfsiz yo'li — g.axes.flat. g.axes_dict esa facet qiymati bo'yicha kalitlanadi: g.axes_dict["Sat"], yoki row va col ikkalasi berilganda g.axes_dict[("Yes", "Sat")]. axes_dict ni afzal ko'ring, chunki col_order o'zgarsa pozitsion indekslash indamay noto'g'ri panel ga ishora qila boshlaydi. JointGrid da panel larning nomi to'g'ridan-to'g'ri berilgan: g.ax_joint, g.ax_marg_x, g.ax_marg_y.
S: 12 ta column li DataFrame da sns.pairplot(df) 5×5 grid hosil qildi. Nima sodir bo'ldi?
Pairplot faqat raqamli column lardan foydalanadi va qolganlarini indamay e'tiborsiz qoldiradi, demak yettita column raqamli emas edi — yo haqiqatan kategoriyali, yo "N/A", mingliklar ajratgichi yoki valyuta belgisi kabi begona tokenlar tufayli object sifatida o'qilgan raqamli ma'lumot. df.dtypes ni tekshiring va agar column kiritilishi kerak bo'lgan bo'lsa, pd.to_numeric(..., errors="coerce") bilan majburan o'zgartiring. Bundan tashqari, yetishmayotgan qiymatli qatorlar ta'sirlangan katakchalardan tashlab yuboriladi, shuning uchun panel dagi namuna hajmi len(df) dan kichik bo'lishi mumkin.
20.12 Xulosa
- Seaborn function lari ikkiga bo'linadi: axes-level (bitta
Axesga chizadi,ax=ni qabul qiladi,Axesqaytaradi) va figure-level (butunFigureni egallaydi,col=/row=ni qo'llab-quvvatlaydi,height=/aspect=bilan o'lchanadi, Grid qaytaradi). To'rtta faceting wrapper:relplot,displot,catplot,lmplot. - Small multiples bitta grafika dizaynini dataset ning qismlari bo'ylab umumiy masshtabda takrorlaydi va qiyin colour solishtirish vazifasini oson pozitsiya solishtirish vazifasiga aylantiradi.
- Qo'lda qurilgan
FacetGrid— constructor, keyinmap()yokimap_dataframe(), keyinadd_legend()— custom mark lar, qatlamli panel lar va har bir facet uchun alohida izohlar uchun zaxira yo'l. - Layout quyidagilar bilan boshqariladi:
col_wrap(uzun qatorlarni buklaydi;row=bilan mos kelmaydi),sharex/sharey(solishtirish mumkinligi, figure-level chaqiruvlardafacet_kwsorqali uzatiladi),height/aspect(har bir facet uchun dyuym) va yorliqlash uchunmargin_titleshamdaset_titles(). pairplothar bir raqamli juftlikni ko'rsatadi; diagonal da distribution turadi, chunki o'zgaruvchini o'ziga qarshi chizish ma'lumot bermaydi,corner=Trueesa ko'zgudagi yarmini olib tashlaydi. Doimvars=bilan cheklang — panel lar soni k² bo'yicha o'sadi.PairGridmap_upper,map_lowervamap_diagni qo'shadi, shuning uchun matritsaning har bir sohasi turli mark yoki correlation kabi hisoblangan izohni ko'tarishi mumkin.jointplotmarkaziy ikki o'zgaruvchili grafikani (kind=scatter, kde, hist, hex, reg, resid) marginal distribution lar bilan birlashtiradi;JointGridesaplot_joint,plot_marginalsva nomlanganax_joint/ax_marg_x/ax_marg_yaxes lari bilan qatlamlash imkonini beradi.- Qaytarilgan grid orqali sozlang:
g.figure.suptitle(..., y=1.02),g.set_axis_labels(),g.set_titles("{col_name}"),g.set(xlim=...),g.tight_layout(),g.savefig(), hamda alohida panel lar uchung.axes/g.axes_dict. - Takrorlanadigan tuzoqlar:
plt.title()faqat oxirgi facet ga tushishi,plt.figure(figsize=...)e'tiborsiz qolishi, eskirgang.fig, pairplot ning k² portlashi, indamay tashlab yuborilgan raqamli bo'lmagan column lar va NaN qatorlar, chalg'ituvchi shared bo'lmagan axes lar, haddan ortiq ko'p facet, unutilgantight_layout()va CSV larni keshlamasangizload_dataset()uchun tarmoq talab qilinishi.
Keyingi: 21-bob styling ga bag'ishlanadi — theme lar, palette lar, context va figure larni saqlash.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.