๋์ ๋ง๋๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
๐ฝ ํ์ฉ ๋ฐ์ดํฐ์ - seaborn Tips
tips = sns.load_dataset('tips')
tips2 = tips.groupby(['time','sex'])['tip'].mean().unstack(1)
๐ ๋์ ๋ง๋๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
#stacked=True ๋ก ์ค์ ํ๋ฉด ๋์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
stacked_plot= tips2.plot(kind='bar', stacked=True, color = ['#D4F0F0','#FEE1E8'])
plt.title("Average tips by time")
plt.xlabel("time")
plt.xticks(rotation = 0)
plt.ylabel("gender")
plt.legend(loc='upper left')
- `kind = 'bar'`์ต์ ์ ์ด์ฉํด ๋ง๋๊ทธ๋ํ ์ ํ
- `stacked = True`๋ก ๋์ผ๋ฉด ๋์ ๋ง๋๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์๋ค.
- ์ํ๋ ์์๊ฐ์ color = [ ์์๊ฐ1, ์์๊ฐ2]์ ๊ฐ์ ์ง์ ํ๋ค.
์ด์ค์ถ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
๐ฝ ํ์ฉ ๋ฐ์ดํฐ์ - seaborn ์์ด๋ฆฌ์ค
iris = sns.load_dataset('iris')
๐ ์ด์ค์ถ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
1. ๊ธฐ๋ณธ ์คํ์ผ ์ค์
# plot ์คํ์ผ ์ง์
plt.style.use('ggplot')
# ๊ทธ๋ํ์ ํ์๋ ํฐํธ ์ฌ์ด์ฆ ์ง์
plt.rcParams['font.size'] = 10
2. ๋ฐ์ดํฐ ์ค๋น
x = iris['species'].unique()
y1 = iris.groupby('species')['sepal_length'].mean().values
y2 = iris.groupby('species')['sepal_width'].mean().values
3. ๊ธฐ๋ณธ ๋ง๋๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
fig, ax1 = plt.subplots()
# ๊ธฐ๋ณธ Lineplot ๊ทธ๋ฆฌ๊ธฐ
ax1.plot(x, y1, '-o', color='green', markersize=7, linewidth=5, alpha=0.7, label='sepal_width')
ax1.set_ylim(0, 10) # y์ถ ๋ฒ์ ์ง์
ax1.set_xlabel('Species') # x์ถ์ด๋ฆ ์ง์
ax1.set_ylabel('sepal_width') # y์ถ์ด๋ฆ ์ง์
# ๋๊ธ ์์ฑ ์ง์
ax1.tick_params(axis='both', direction='in')
- ๊ธฐ๋ณธ Lineplot ๊ทธ๋ฆฌ๊ธฐ
- '-o' : ์ ๊ทธ๋ํ์ x์ถ ์งํ๋ณ ์ ๋ฃ๊ธฐ
- ๋๊ธ ์์ฑ ์ง์ ํ๊ธฐ.tick_params()
- axis = 'both' : x์ถ๊ณผ y์ถ ๋ชจ๋์ ๋๊ธ์ ๋ํด์ ์ค์
- direction = 'in' : ๊ทธ๋ํ์ x์ถ๊ณผ y์ถ ๋ชจ๋์ ๋๊ธ์ ๋ํด์ ์ค์
4. x์ถ๊ณต์
# x์ถ ๊ณต์ (์ฆ, ์ด์ค์ถ ์ฌ์ฉ ์๋ฏธ)
ax2 = ax1.twinx()
# ๋๋ฒ์งธ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
ax2.bar(x, y2, color='pink', label='sepal_length', alpha=0.7, width=0.7)
ax2.set_ylim(0, 10) # y์ถ ๋ฒ์ ์ค์
ax2.set_ylabel('sepal_length')
# ๋๊ธ ์์ฑ ์ง์
ax2.tick_params(axis='y', direction='in')
5. ๋ฒ๋ก ๋ฐ ๋ ์ด๋ธ ํ์
# ๋ฒ๋ก ํ์
lines, labels = ax1.get_legend_handles_labels()
bars, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines + bars, labels + labels2, loc='upper left')
# ๊ทธ๋ํ ์ ๋ชฉ ์ค์
plt.title('Sepal Width and Length by Species', size=12)
plt.show()
- .get_legend_handles_labels() : ๊ทธ๋ํ์ ๋ํ ๋ฒ๋ก(legend) ํธ๋ค๊ณผ ๋ ์ด๋ธ์ ๊ฐ์ ธ์จ๋ค.
- .legend(๋ฒ๋กํธ๋ค1 + ๋ฒ๋กํธ๋ค2, ๋ ์ด๋ธ1 + ๋ ์ด๋ธ2, loc = '์์น') : ๋๊ฐ ๋ ์ด๋ธ์ ํฉ์ณ์ ํ๋์ ๋ฒ๋ก๋ก ํ์
ํผ๋ผ๋ฏธ๋ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
๐ฝ ํ์ฉ ๋ฐ์ดํฐ์ - seaborn Titanic
titanic = sns.load_dataset("titanic")
# ๋์ด ํํ ๊ตฌ๊ฐ ์ค์ ์ผ๋ก ๋ณ๊ฒฝ
bins = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80]
bin_labels = [10,15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80]
# cut ํ์ฉ ์ ๋๊ตฌ๊ฐ ๋๋๊ธฐ
titanic['bin'] = pd.cut(titanic['age'], bins = bins)
titanic['age'] = titanic['bin'].map(lambda x: str(x.left) + " - " + str(x.right))
# groupby ๋ฐ ํผ๋ฒ์ผ๋ก ๊ทธ๋ฃนํ
titanic = titanic.groupby(['age','sex'])['bin'].count().reset_index()
titanic = pd.pivot_table(titanic, index='age', columns='sex', values='bin').reset_index()
๐ ํผ๋ผ๋ฏธ๋ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
1. ํผ๋ผ๋ฏธ๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด ํ์ํ ๊ฐ์ ๊ณ์ฐํ๋ค.
titanic["Female_Left"] = 0
titanic["Female_Width"] = titanic["female"]
titanic["Male_Left"] = -titanic["male"]
titanic["Male_Width"] = titanic["male"]
titanic
2. ๋ฐ(bar)๋ฅผ ํ์ํด์ค๋ค.
dplot6 = plt.figure(figsize=(7,5))
# ์์ชฝ์ ๋ง๋(bar)๊ทธ๋ฆฌ๊ธฐ
plt.barh(y=titanic["age"], width=titanic["Female_Width"], color="#ED553B", label="Female")
plt.barh(y=titanic["age"], width=titanic["Male_Width"], left=titanic["Male_Left"],color="#3CAEA3", label="Male")
# ๊ทธ๋ํ ๋ฒ์ ์ ํํ๊ธฐ
plt.xlim(-100,100)
plt.ylim(-2,15)
# ์์ชฝ ์์ญ์ ๋ฒ๋ก๋ฅผ ํ
์คํธ๋ก ํํํ๊ธฐ
plt.text(-60, 13.7, "Male", fontsize=10, fontweight="bold")
plt.text(50, 13.7, "Female", fontsize=10, fontweight="bold")
3. ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๊ฐ์ ๋ํ ๋ ์ด๋ธ๋ง์ ์งํํ๋ค.
for idx in range(len(titanic)):
plt.text(x=titanic["Male_Left"][idx]-0.5, y=idx, s="{}".format(titanic['male'][idx]),
ha="right", va="center",
fontsize=8, color="#3CAEA3")
plt.text(x=titanic["Female_Width"][idx]+0.5, y=idx, s="{}".format(titanic["female"][idx]),
ha="left", va="center",
fontsize=8, color="#ED553B")
4. ๊ทธ๋ํ ์ ๋ชฉ์ ์ค์ ํ๋ค.
plt.title("Pyramid plot", loc="center", pad=15, fontsize=15, fontweight="bold")
์ฌ๋ฌ๊ฐ์ ๊ทธ๋ํ ํ๋ฒ์ ๊ทธ๋ฆฌ๊ธฐ
๐ฝ ํ์ฉ ๋ฐ์ดํฐ์ - seaborn Penguins
penguins = sns.load_dataset('penguins')
penguins.head()
๐ ์ฌ๋ฌ๊ฐ์ ๊ทธ๋ํ ํ๋ฒ์ ๋ฃ๊ธฐ
# figure์ ax ๋ง๋ค๊ธฐ
fig, ax = plt.subplots(2, 2)
# ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
ax[0, 0].hist(penguins['body_mass_g'])
ax[0, 1].boxplot(penguins.groupby('sex')['bill_depth_mm'].apply(list))
ax[1, 0].plot(penguins.groupby('species')['bill_length_mm'].mean())
ax[1, 1].scatter(penguins['bill_length_mm'],penguins['bill_depth_mm'])
# ๊ทธ๋ํ ์ฌ์ด ๊ฐ๊ฒฉ ์ถ๊ฐ
fig.subplots_adjust(hspace=0.5, wspace=0.3)
# ๊ทธ๋ํ๋ณ ํ์ดํ ์ถ๊ฐ
ax[0, 0].set_title("hist plot", fontsize=9)
ax[0, 1].set_title("box plot", fontsize=9)
ax[1, 0].set_title("line plot", fontsize=9)
ax[1, 1].set_title("scatter plot", fontsize=9)
plt.show()
- subplots(2,2) → 2 x 2 ์ด 4๊ฐ์ ์นธ์ ๋ง๋ค๊ฒ ๋ค๊ณ ์ ์ธํ๋ ๊ฒ (ํ๋ ์ ๋ง๋ค๊ธฐ)
- ์์น ์ขํ์ ๋ฐ๋ผ plot์ ํ ๋นํ๊ธฐ
- subplots_adjust๋ฅผ ์ด์ฉํด ๊ทธ๋ํ ์ฌ์ด ๊ฐ๊ฒฉ์ ๋ฃ์ด์ฃผ๊ธฐ
- ๊ทธ๋ํ๋ณ ํ์ดํ ์ถ๊ฐํ๊ธฐ : ์์น์ขํ.set_title('ํ์ดํ๋ช ', fontsize='๊ธ์ํฌ๊ธฐ์ง์ )