Seaborn asoslari
I qism DataFrame bilan yakunlangan edi. II qism esa o'sha DataFrame ni inson bir qarashda tushuna oladigan narsaga aylantiradi.
Bu bob mental model quradi — Seaborn nima, u matplotlib bilan qanday bog'liq, qanday data shape ni talab qiladi va uning butun function library si qanday tuzilgan. Shu to'rt narsani to'g'ri o'zlashtirsangiz, undan keyingi barcha boblar shunchaki parameter lardan iborat bo'lib qoladi.
Seaborn nima?
Seaborn — statistik data visualisation uchun mo'ljallangan Python library si; u matplotlib ustiga qurilgan va to'g'ridan-to'g'ri pandas DataFrame lari bilan ishlash uchun yaratilgan.
U sizga amalda beradigan uchta narsa:
- U DataFrame tilida gapiradi. Siz
data=dfni uzatasiz va column larga nomi bo'yicha murojaat qilasiz:x="total_bill". Seaborn column ni o'qiydi, axis ni o'sha nom bilan belgilaydi va mos scale ni tanlaydi. Matplotlib da esa array larni o'zingiz ajratib olasiz va hamma yorliqni o'zingiz yozasiz. - U statistikani siz uchun bajaradi. Bitta call mean va confidence interval ni, yoki kernel density estimate ni, yoki linear fit ni hisoblab, natijani chizib beradi. Matplotlib da avval bularni hisoblab, keyin chizasiz.
- Uning didi bor. Rang lar, oraliqlar, gridline lar va shrift lar default holda o'qishga qulay bo'lishi uchun tanlangan — tasodifan emas.
Matplotlib — bu rassomlik anjomlari solingan quti: qalam, chizg'ich, bo'yoq. Undan hohlagan narsani chizsangiz bo'ladi, lekin har bir chiziqni o'zingiz tortasiz. Seaborn esa o'sha anjomlardan yasalgan, puxta o'ylangan shablonlar to'plami — siz "kunlar bo'yicha tips ning box plot i" deysiz, qolganini u bajaradi. Anjomlar hamon qutida turibdi, shuning uchun shablon qamrab olmagan narsani baribir qo'lda chizishingiz mumkin.
Seaborn va matplotlib
Talabalar ko'pincha ulardan birini tanlash kerak deb o'ylashadi. Aslida bunday emas — Seaborn bu matplotlib. Har bir Seaborn function i matplotlib object larini yaratadi va deyarli har bir real plot ni siz bir nechta matplotlib call i bilan yakunlaysiz.
Bir xil chart, ikki xil yo'l bilan:
# matplotlib: grouping, joylashtirish va yorliqlarni o'zingiz qilasiz import matplotlib.pyplot as plt means = tips.groupby("day")["total_bill"].mean() plt.bar(means.index, means.values) plt.xlabel("day") plt.ylabel("total_bill") plt.title("Average bill by day") # seaborn: bitta qator, error bar lar esa tekinga keladi import seaborn as sns sns.barplot(data=tips, x="day", y="total_bill")
matplotlibSeaborn
Kirish ma'lumotiArray / list larDataFrame + column nomlari
Axis yorliqlariO'zingiz yozasizColumn nomlaridan olinadi
StatistikaAvval o'zingiz hisoblaysizCall ning ichida hisoblanadi
Category bo'yicha groupingLoophue=
Default ko'rinishOddiyO'ylangan
NazoratTo'liqYuqori, ostida matplotlib bilan
Nima uchun eng mosG'ayrioddiy har qanday narsaStandart statistik chart lar
:::info 📌 Ish taqsimoti
Seaborn chart ni chizadi; matplotlib uni yakunlaydi. Real plot — bu bitta Seaborn call i, undan keyin plt.title(), plt.xticks(rotation=45) va plt.savefig(). Bu normal pattern, Seaborn ning kamchiligi emas.
:::
O'rnatish va import qilish
`pip install seaborn # matplotlib, pandas va numpy ni o'zi bilan olib keladi
conda install seaborn`
import seaborn as sns # universal alias import matplotlib.pyplot as plt import pandas as pd sns.set_theme(style="whitegrid") # Seaborn styling ini qo'llash (21-bob) print(sns.__version__) # tekshiring: bu qo'llanma 0.12+ ni nazarda tutadi
0.13.2
:::gotcha ⚠️ Bu yerda version odatdagidan ko'ra muhimroq
Seaborn 0.12 versiyasida jiddiy o'zgardi. Eski darsliklar hanuz sns.distplot() ni ko'rsatadi — u olib tashlangan, o'rniga histplot/kdeplot/displot keldi — va ci=95 ham deprecated bo'lib, o'rniga errorbar=("ci", 95) ishlatiladi. Agar talabaning kodi "unexpected keyword argument" xatosini bersa, demak darslik uning library sidan eskiroq. Avval doim sns.__version__ ni tekshiring.
:::
Bu — qolib ketgan hazil: library The West Wing serialidagi Samuel Norman Seaborn ismli qahramon sharafiga atalgan. Talabalar buni doim so'rashadi, endi bilib qo'ydingiz.
Tidy data — eng muhim yagona qoida
Yangi boshlovchi duch keladigan deyarli har bir Seaborn muammosi aslida data shape muammosidir. Seaborn long (tidy) format ni kutadi:
Bir xil ma'lumotni ikkala shakl da solishtiring:
Wide format — inson uchun qulay, Seaborn uchun noto'g'ri:
| student | math | physics | english |
|---|---|---|---|
| Aziza | 92 | 88 | 95 |
| Bekzod | 75 | 64 | 70 |
Long format — Seaborn xohlaydigan shakl:
| student | subject | score |
|---|---|---|
| Aziza | math | 92 |
| Aziza | physics | 88 |
| Aziza | english | 95 |
| Bekzod | math | 75 |
| Bekzod | physics | 64 |
| Bekzod | english | 70 |
Long variantda "subject" haqiqiy column — shuning uchun hue="subject" deb yozish mumkin. Wide variantda esa bunday column yo'q, faqat uchta column nomi bor va hue= ga beradigan hech narsa qolmaydi. Butun qiyinchilik ana shunda.
`# wide → long long_df = wide_df.melt(id_vars="student", var_name="subject", value_name="score")
long → wide (heatmap uchun, 18-bob)
wide_df = long_df.pivot(index="student", columns="subject", values="score"):::info 📌 Nega I qism behuda ketmadi
Normalization qilingan database ni JOIN qilsangiz, natija **avtomatik** long format bo'lib chiqadi — har bir enrollment uchun bitta row, column lar esa student, course va grade. Bu aynan Seaborn talab qiladigan shakl. Sizning SQL query ingiz reshaping ishini allaqachon bajarayotgan bo'ladi;melt` faqat ma'lumot spreadsheet dan kelganda kerak bo'ladi.
Agar database dagi ma'lumotingiz wide bo'lsa ham, 9-bobdagi UNION ALL unpivot xuddi shu ishni Python ga yetib bormasidan oldin bajaradi.
:::
sns.heatmap() — wide ma'lumotni, ya'ni matritsani talab qiladigan yagona function. Qolgan hammasi long ni kutadi. Talabalar "seaborn ketma-ket emas" deganda, odatda aynan shuni nazarda tutishadi; buni 18-bobdan keyin emas, oldin aytib qo'ygan ma'qul.
Ichki dataset lar
Seaborn namunaviy dataset lar bilan keladi, shuning uchun ma'lumot qidirib yurmasdan dars o'tishingiz mumkin.
tips = sns.load_dataset("tips") # 244 ta restoran hisobi penguins = sns.load_dataset("penguins") # 344 ta pingvin, 3 ta species titanic = sns.load_dataset("titanic") # 891 ta yo'lovchi flights = sns.load_dataset("flights") # oylik yo'lovchilar 1949-1960 iris = sns.load_dataset("iris") # klassik 150 ta gul print(sns.get_dataset_names()) # to'liq ro'yxat
['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'dowjones', 'exercise', 'flights', 'fmri', 'geyser', 'glue', 'healthexp', 'iris', 'mpg', 'penguins', 'planets', 'seaice', 'taxis', 'tips', 'titanic']
DatasetRow larNimani o'rgatishga qulay
tips244Category lar + sonlar: bill, tip, day, sex, smoker, party size
penguins344Distribution lar va klasterlar; haqiqiy NaN lar bor
titanic891Binary natijalar, yetishmayotgan ma'lumot, logistic regression
flights144Time series, mavsumiylik va pivot qilingandan keyin heatmap lar
iris150pairplot va bir-biridan ajraladigan guruhlar
:::gotcha ⚠️ load_dataset() internetdan yuklab oladi
U har safar GitHub dan olib keladi va library ning ichiga joylanmagan. Internet ishonchli bo'lmagan sinfxonada har bir misol birinchi qatordayoq ishlamay qoladi.
Offline nusxalarni uyda, bir marta tayyorlab qo'ying:
# internet BOR joyda bir marta ishga tushiring import seaborn as sns for name in ["tips", "penguins", "titanic", "flights", "iris"]: sns.load_dataset(name).to_csv(f"data/{name}.csv", index=False) # keyin darsda internet kerak bo'lmaydi import pandas as pd tips = pd.read_csv("data/tips.csv")
II qismdagi qolgan hamma narsa xuddi shunday ishlayveradi — DataFrame ikkala holatda ham bir xil. :::
Birinchi plot laringiz
Eng minimal ishlaydigan Seaborn call i bitta qatordan iborat:
import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") sns.scatterplot(data=tips, x="total_bill", y="tip") plt.show()
Bitta qator kod: sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time"). Legend avtomatik chiqadi.
Argument larni gap sifatida o'qing: "scatter plot, tips ma'lumotidan foydalanib, pastda total_bill, yon tomonda tip." Har bir Seaborn function i shu pattern ga amal qiladi, shuning uchun birinchisini o'rgansangiz, qolganlarining ko'pini ham bilib olasiz.
Uchinchi o'zgaruvchini qo'shish uchun bitta so'z yetadi:
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time")
Endi tushlik va kechki ovqat har xil ranglarda chiziladi va legend avtomatik paydo bo'ladi. Siz na loop, na rang ro'yxati, na legend kodini yozdingiz.
Real, taqdimotga tayyor plot — II qism davomida ishlatiladigan pattern:
sns.set_theme(style="whitegrid") # 1. styling plt.figure(figsize=(9, 5)) # 2. o'lcham (matplotlib) sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time", size="size", alpha=0.7) # 3. plot ning o'zi plt.title("Tip vs total bill") # 4. yakunlash (matplotlib) plt.xlabel("Total bill (USD)") plt.ylabel("Tip (USD)") plt.tight_layout() plt.savefig("tips.png", dpi=300, bbox_inches="tight") # 5. show DAN OLDIN saqlang plt.show()
:::gotcha ⚠️ Ko'rsatishdan oldin saqlang
plt.show() joriy figure ni tozalab yuboradi. Undan keyin plt.savefig() ni chaqirsangiz, bo'sh rasm yoziladi — hech qanday xato xabarisiz. Har doim avval saqlang, keyin ko'rsating. Bunga hamma bir marta tushadi.
:::
Barcha Seaborn function larining xaritasi
Seaborn ning ~25 ta plotting function i ko'p bo'lib tuyuladi — ular to'rtta oilaga bo'linishini va har birining tepasida bitta figure-level function turishini ko'rmaguningizcha.
| Savolingiz | Oila | Bob |
|---|---|---|
| Ikkita son bir-biri bilan qanday bog'liq? | Relational | 15 |
| Bitta son qanday tarqalgan? | Distribution | 16 |
| Son category lar orasida qanday farq qiladi? | Categorical | 17 |
| Ko'p sonlar bir vaqtning o'zida bir-biri bilan qanday bog'liq? | Matrix | 18 |
| Trend bormi, u qanchalik kuchli? | Regression | 19 |
| Pattern har bir kichik guruhda ham saqlanadimi? | Grids | 20 |
Function nomlarini yodlagan talaba real dataset oldida qotib qoladi. "Men qaysi savolga javob bermoqchiman?" deb so'ragan talaba esa yuqoridagi jadvaldan kerakli function ni bir necha soniyada topadi. O'sha jadvalni devorga osib qo'ying.
Axes-level va figure-level
Bu farq Seaborn ning chalkash xatti-harakatlarini boshqa hamma narsadan ko'ra ko'proq tushuntiradi, shuning uchun u bilan 20-bobda emas, hozir tanishing.
| Axes-level | Figure-level | |
|---|---|---|
| Misollar | scatterplot, histplot, boxplot, regplot |
relplot, displot, catplot, lmplot |
| Qayerga chizadi | Mavjud bitta Axes ga | O'zining yangi figure iga |
| Nimani qaytaradi | matplotlib Axes |
Seaborn Grid |
ax= ni qabul qiladimi |
Ha | Yo'q |
col=/row= bilan facet qila oladimi |
Yo'q | Ha |
| O'lchamni boshqarish | plt.figure(figsize=...) |
height=, aspect= |
| Sarlavha | plt.title() |
g.figure.suptitle() |
# axes-level: o'zingiz boshqaradigan matplotlib layout ga joylashadi fig, axes = plt.subplots(1, 2, figsize=(12, 4)) sns.histplot(data=tips, x="total_bill", ax=axes[0]) sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[1]) # figure-level: butun figure ni egallaydi, lekin column bo'yicha bo'lib chiza oladi g = sns.relplot(data=tips, x="total_bill", y="tip", col="time", height=4) g.figure.suptitle("Tips by service", y=1.03)
:::gotcha ⚠️ Talabalar aytadigan ikkita alomat
- "Sarlavham faqat oxirgi panelda chiqdi." Siz figure-level plot da plt.title() ni ishlatdingiz. U joriy Axes ga, ya'ni oxirgi subplot ga sarlavha qo'yadi. g.figure.suptitle() dan foydalaning.
- "figsize hech narsa qilmadi." Figure-level function lar o'z figure ini quradi va plt.figure(figsize=...) ni e'tiborsiz qoldiradi. Uning o'rniga height= va aspect= ni ishlating — kenglik height × aspect ga teng.
:::
Default holda axes-level function dan foydalaning — u matplotlib bilan birga quriladi va dashboard larga joylashadi. col= yoki row= faceting kerak bo'lgan zahoti figure-level ga o'ting; bu — axes-level function lar qila olmaydigan yagona narsa.
hue, size, style — semantic mapping
Seaborn ning eng kuchli g'oyasi rasmiy nomga ega: semantic mapping — data column ini vizual xususiyatga biriktirish.
| Parameter | Vizual xususiyat | Nima uchun eng mos |
|---|---|---|
hue= |
Rang | Category lar yoki uzluksiz qiymat |
size= |
Marker o'lchami / chiziq qalinligi | Uzluksiz miqdor |
style= |
Marker shakli / chiziq punktiri | Bir nechta category (2–4) |
col=, row= |
Alohida panel lar | Category lar, ustma-ust tushish chalkashtirsa |
# bitta chart da to'rtta o'zgaruvchi — faceting bilan yana bittasi qo'shilib beshta bo'ladi sns.relplot(data=tips, x="total_bill", y="tip", # 1 va 2: pozitsiya hue="day", # 3: rang size="size", # 4: nuqta o'lchami col="time") # 5: panel
:::gotcha ⚠️ Qila olishingiz — qilish kerak degani emas Beshta o'zgaruvchini kodlagan chart odatda o'qib bo'lmaydigan bo'ladi. Pozitsiya (x va y) — o'quvchi uchun eng aniq kanal; undan keyin rang keladi; o'lcham esa haqiqatan ham yomon ishlaydi — odam yuzani yaxshi baholay olmaydi. Amalda bitta chart ga ikki yoki uchta o'zgaruvchi chegara hisoblanadi. Undan ortig'i uchun faceting ni (20-bob) ishlating: u o'quvchiga tiqilinch legend ni yechish o'rniga panel lar bo'ylab pozitsiyalarni solishtirish imkonini beradi. :::
hue= ga numeric column bersangiz, Seaborn categorical legend o'rniga uzluksiz colourbar ga o'tadi. Bu to'g'ri xatti-harakat, lekin agar column aslida sonlar ko'rinishida saqlangan category bo'lsa (1–5 oralig'idagi rating, course_id), avval uni o'zgartiring — df["rating"].astype(str) yoki astype("category") — aks holda ma'nosiz gradient olasiz.
Keng tarqalgan xatolar
| Xato | Nima sodir bo'ladi | Yechim |
|---|---|---|
| Long format kutadigan function ga wide ma'lumot berish | Noto'g'ri chart yoki xato | Avval df.melt(...) |
heatmap ga long ma'lumot berish |
Xato yoki ma'nosiz natija | Uni pivot qilib matritsaga aylantiring |
plt.show() dan keyin plt.savefig() |
Bo'sh rasm, xatosiz | Avval saqlang, keyin ko'rsating |
Figure-level plot da plt.title() |
Faqat oxirgi panelga sarlavha qo'yiladi | g.figure.suptitle() |
relplot bilan plt.figure(figsize=) |
E'tiborsiz qoldiriladi | height=, aspect= |
sns.distplot() dan foydalanish |
0.12+ da olib tashlangan | histplot / kdeplot / displot |
ci=95 dan foydalanish |
Deprecated ogohlantirishi | errorbar=("ci", 95) |
| DataFrame o'rniga numpy array uzatish | Axis lar yorliqlarini yo'qotadi | data=df va column nomlarini uzating |
| Darsda internet yo'q | load_dataset() ishlamaydi |
CSV larni oldindan saqlab qo'ying |
| Bir vaqtda beshta o'zgaruvchini kodlash | O'qib bo'lmaydi | Uning o'rniga facet qiling |
Intervyu savollari
S: Seaborn nima va u matplotlib bilan qanday bog'liq?
Bu — matplotlib ustiga qurilgan statistik visualisation library si. U DataFrame bilan ishlaydigan plotting ni, ichki statistik baholashni va yaxshiroq default larni qo'shadi, lekin u yaratadigan har bir object matplotlib object idir, shuning uchun ikkalasi bir-biriga muqobil emas, balki birga ishlatiladi.
S: Seaborn qanday data format ni kutadi?
Long (tidy) format: har bir kuzatuvga bitta row, har bir o'zgaruvchiga bitta column. Istisno — heatmap, unga wide matritsa kerak. melt() va pivot() bilan o'zgartiriladi.
S: Axes-level va figure-level function o'rtasida qanday farq bor?
Axes-level function lar mavjud bitta Axes ga chizadi, ax= ni qabul qiladi va Axes qaytaradi. Figure-level function lar o'z figure ini yaratadi, Grid object qaytaradi, col=/row= faceting ni qo'llab-quvvatlaydi va figsize= o'rniga height=/aspect= ni oladi.
S: Nega catplot da plt.title() ishlamadi?
Chunki catplot figure-level. plt.title() joriy Axes ga — ya'ni oxirgi subplot ga sarlavha qo'yadi. g.figure.suptitle() dan foydalaning.
S: hue, size va style nima qiladi?
Ular data column ini mos ravishda rangga, marker o'lchamiga va marker/chiziq style iga map qiladi. Bu semantic mapping deb ataladi va chart ga uchinchi yoki to'rtinchi o'zgaruvchini shu tarzda qo'shasiz.
S: Bitta chart nechta o'zgaruvchini kodlashi kerak?
Amalda ikki yoki uchta. Pozitsiya eng aniq idrok etiladigan kanal, undan keyin rang, o'lcham esa yomon. Uchtadan ortig'ini small multiples ga facet qiling.
S: distplot o'rniga nima keldi?
Axes level da histplot, kdeplot va ecdfplot, figure-level kirish nuqtasi sifatida esa displot. distplot 0.12 da olib tashlangan.
S: Saqlangan PNG faylingiz bo'sh chiqdi. Nega?
plt.savefig() figure ni tozalaydigan plt.show() dan keyin chaqirilgan. Ko'rsatishdan oldin saqlang.
Xulosa
- Seaborn — bu statistika va didi bor matplotlib. U DataFrame larni column nomi bo'yicha o'qiydi, baholashlarni siz uchun hisoblaydi va qo'lda yakunlashingiz mumkin bo'lgan matplotlib object larini qaytaradi.
- Long (tidy) format — asosiy qoida: har bir kuzatuvga bitta row, har bir o'zgaruvchiga bitta column.
heatmapyagona istisno va u wide matritsani xohlaydi. - Normalization qilingan database ning JOIN i allaqachon long format beradi — I qism reshaping ishini siz uchun bajarib qo'ygan.
load_dataset()uchun internet kerak. Dars uchun CSV larni oldindan saqlab qo'ying.- To'rtta oila — relational, distribution, categorical, regression — hamda matrix va grids. Function nomi bo'yicha emas, savol bo'yicha tanlang.
- Axes-level (
scatterplot,boxplot)ax=ni qabul qiladi va matplotlib bilan birga quriladi. Figure-level (relplot,catplot) o'z figure iga egalik qiladi,col=/row=ni qo'llab-quvvatlaydi vag.figure.suptitle()hamdaheight=/aspect=ni talab qiladi. hue,size,style,col,rowcolumn larni vizual xususiyatlarga map qiladi — lekin o'qish uchun qulay chegara bitta chart ga ikki yoki uchta o'zgaruvchi.- Ko'rsatishdan oldin saqlang, aks holda bo'sh fayl olasiz.
sns.__version__ni tekshiring: bu qo'llanma 0.12+ ni nazarda tutadi, undadistplotyo'q vaci=errorbar=ga aylangan.
Keyingisi: 15-bob relational plot lar bilan boshlanadi — scatterplot, lineplot va relplot.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.