Asosiy qismga o'tish

FacetGrid, pairplot, jointplot

20-bob 28 kod bloki 8876 so'z

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.

🧩 O'xshatish

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
AMALIY QOIDAAgar function nomi 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
python18 qator
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= yoki row= 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 GridSpec ichiga tushadigan har qanday narsa; sizga Axes uzatadigan dashboard framework ichidagi har qanday narsa.
💡 Har doim bir pog'ona pastga tusha olasiz

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.

📌 `figsize` emas, `height`/`aspect`

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.

🧩 O'xshatish

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.

python15 qator
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.

python11 qator
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
python8 qator
# 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.

python15 qator
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 ($)")
QACHON QO'LDA QURISH KERAKrelplot/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.
⚠️ `map()` legend qo'shmaydi

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.

python4 qator
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` va `row` bir vaqtda ishlatilmaydi

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.

python7 qator
# 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")
⚠️ `sharey` qayerga yoziladi?

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
💡 Oqilona boshlang'ich qiymatlar

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.

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

python8 qator
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)
📌 Facet tartibi kategoriya tartibiga ergashadi

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.

python4 qator
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)

python26 qator
# 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)
💡 Har qanday yangi raqamli dataset da birinchi harakat

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

python16 qator
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)
📌 `diag_sharey=False`

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.

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

python12 qator
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
python6 qator
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},
)
⚠️ `kind="reg"` va `kind="hex"` `hue` ni qabul qilmaydi

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
python19 qator
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 VA JOINTGRIDjointplot = 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)
python11 qator
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

python20 qator
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)
💡 `axes_dict` indeks hisob-kitobidan ustun

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

python7 qator
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.

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

⚠️ `suptitle` da `y=1.02`

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

python10 qator
# 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
python4 qator
# 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)
💡 Avval heatmap, keyin pairplot

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" tufayli object sifatida o'qilgan raqamli column shunchaki yo'qoladi.
  • Yetishmayotgan qiymatli qatorlar ular ta'sir qiladigan katakchalar uchun tashlab yuboriladi. penguins da sex column ida NaN lar bor; pairplot(penguins, hue="sex") indamay len(penguins) dan kamroq qatorni tahlil qiladi.
python8 qator
# 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)
Chiqish
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
⚠️ Sharing ni o'chirsangiz, buni aytib qo'ying

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.

python5 qator
# 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.

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

python14 qator
# 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)
📌 Seaborn da hech narsa uning o'z dataset lariga bog'liq emas

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'rniga g.legend.set_title(...) yoki g.legend.remove() dan foydalaning.
  • col_wrap siz kutgan y-axis sharing xatti-harakatini o'chiradi. col_wrap bilan 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

python54 qator
# 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 Axes ga chizadi, ax= ni qabul qiladi, Axes qaytaradi) va figure-level (butun Figure ni 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, keyin map() yoki map_dataframe(), keyin add_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 chaqiruvlarda facet_kws orqali uzatiladi), height/aspect (har bir facet uchun dyuym) va yorliqlash uchun margin_titles hamda set_titles().
  • pairplot har bir raqamli juftlikni ko'rsatadi; diagonal da distribution turadi, chunki o'zgaruvchini o'ziga qarshi chizish ma'lumot bermaydi, corner=True esa ko'zgudagi yarmini olib tashlaydi. Doim vars= bilan cheklang — panel lar soni k² bo'yicha o'sadi.
  • PairGrid map_upper, map_lower va map_diag ni qo'shadi, shuning uchun matritsaning har bir sohasi turli mark yoki correlation kabi hisoblangan izohni ko'tarishi mumkin.
  • jointplot markaziy ikki o'zgaruvchili grafikani (kind= scatter, kde, hist, hex, reg, resid) marginal distribution lar bilan birlashtiradi; JointGrid esa plot_joint, plot_marginals va nomlangan ax_joint/ax_marg_x/ax_marg_y axes 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 uchun g.axes/g.axes_dict.
  • Takrorlanadigan tuzoqlar: plt.title() faqat oxirgi facet ga tushishi, plt.figure(figsize=...) e'tiborsiz qolishi, eskirgan g.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, unutilgan tight_layout() va CSV larni keshlamasangiz load_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.

Telegramda yozish Narxlar