Python Library/Matplotlib

[Matplotlib - Python] Plotting with pandas and seaborn

바보1 2022. 6. 16. 02:55

Line Plots

 

s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()

Series 데이터를 plot한 모습입니다.

df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),
                  columns=['A', 'B', 'C', 'D'],
                  index=np.arange(0, 100, 10))
df.plot()

DataFrame을 그려넣은 모습입니다.


Bar Plots

 

 

 

fig, axes = plt.subplots(2, 1)
data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)
data.plot.barh(ax=axes[1], color='k', alpha=0.7)

Series 데이터를 시각화한 모습입니다.

이때 bar은 수직으로, barh는 수평으로 그립니다.

시각화할 데이터 프레임은 다음과 같습니다.

df = pd.DataFrame(np.random.rand(6, 4),
                  index=['one', 'two', 'three', 'four', 'five', 'six'],
                  columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df



Genus	A		B		C		D
one	0.370670	0.602792	0.229159	0.486744
two	0.420082	0.571653	0.049024	0.880592
three	0.814568	0.277160	0.880316	0.431326
four	0.374020	0.899420	0.460304	0.100843
five	0.433270	0.125107	0.494675	0.961825
six	0.601648	0.478576	0.205690	0.560547
df.plot.bar()

인덱스를 x축으로 삼고, 각 Column에 맞게 그림을 그립니다.

df.plot.barh(stacked=True, alpha=0.5)

수평으로 그리고, stacked를 True로 하면 스택 형식으로 쌓습니다.

다른 데이터를 불러오겠습니다.

tips = pd.read_csv('examples/tips.csv')
party_counts = pd.crosstab(tips['day'], tips['size'])
party_counts



size	1	2	3	4	5	6
day						
Fri	1	16	1	1	0	0
Sat	2	53	18	13	1	0
Sun	0	39	15	18	3	1
Thur	1	48	4	5	1	3
party_counts = party_counts.loc[:, 2:5]
party_pcts = party_counts.div(party_counts.sum(1), axis=0)
party_pcts



size	2		3		4		5
day				
Fri	0.888889	0.055556	0.055556	0.000000
Sat	0.623529	0.211765	0.152941	0.011765
Sun	0.520000	0.200000	0.240000	0.040000
Thur	0.827586	0.068966	0.086207	0.017241
party_pcts.plot.bar()

이것도 인덱스를 기준으로 column을 표시하고 있네요

import seaborn as sns
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])
tips.head()



total_bill	tip	smoker	day	time	size	tip_pct
0	16.99	1.01	No	Sun	Dinner	2	0.063204
1	10.34	1.66	No	Sun	Dinner	3	0.191244
2	21.01	3.50	No	Sun	Dinner	3	0.199886
3	23.68	3.31	No	Sun	Dinner	2	0.162494
4	24.59	3.61	No	Sun	Dinner	4	0.172069
sns.barplot(x='tip_pct', y='day', data=tips, orient='h')

sns.barplot(x='tip_pct', y='day', hue='time', data=tips, orient='h')


Histograms and Density Plots

 

 

plt.figure()
tips['tip_pct'].plot.hist(bins=50)

각 bin에 맞게 이산화된 값을 보여줍니다. 이때 빈도수를 나타냅니다.

plt.figure()
tips['tip_pct'].plot.density()

이때는 빈도수를 밀도 함수로 보여줍니다.

plt.figure()

comp1 = np.random.normal(0, 1, size=200)
comp2 = np.random.normal(10, 2, size=200)
values = pd.Series(np.concatenate([comp1, comp2]))
values

0      -0.449034
1       0.050441
2      -0.241866
3      -0.767633
4       1.398120
         ...    
395     8.792639
396     9.359049
397    10.265267
398     7.358782
399    11.104848
Length: 400, dtype: float64
sns.distplot(values, bins=100, color='k')

두 개의 벡터를 연결하여 Series를 만든 후 출력한 모습입니다.

이때 Seaborn의 distplot을 통해 histograms와 밀도 함수를 그려줍니다.


Scatter or Point Plots

 

 

 

macro = pd.read_csv('examples/macrodata.csv')
data = macro[['cpi', 'm1', 'tbilrate', 'unemp']]
trans_data = np.log(data).diff().dropna()
trans_data[-5:]


   	 cpi		m1		tbilrate	unemp
198	-0.007904	0.045361	-0.396881	0.105361
199	-0.021979	0.066753	-2.277267	0.139762
200	0.002340	0.010286	0.606136	0.160343
201	0.008419	0.037461	-0.200671	0.127339
202	0.008894	0.012202	-0.405465	0.042560
plt.figure()

sns.regplot('m1', 'unemp', data=trans_data)
plt.title('Changes in log %s versus log %s' % ('m1', 'unemp'))

serborn의 regplot을 사용함으로써, plot과 동시에 regression line을 그려줍니다.

sns.pairplot(trans_data, diag_kind='kde', plot_kws={'alpha': 0.2})

이를 통해 모든 산점도를 볼 수 있습니다.


Facet Grids and Categorical Data

 

 

 

sns.factorplot(x='day', y='tip_pct', hue='time', col='smoker',
               kind='bar', data=tips[tips.tip_pct < 1])

x는 day, y는 tip_pct이고, 색깔은 time으로 나누었습니다. 마지막으로 col을 기준으로 나타냈네요

이처럼 seaborn의 factorplot은 여러 형태로 나타낼 수 있습니다.

sns.factorplot(x='day', y='tip_pct', row='time',
               col='smoker',
               kind='bar', data=tips[tips.tip_pct < 1])

row를 time으로 col을 smoker로 해서 총 4개가 나왔네요

sns.factorplot(x='tip_pct', y='day', kind='box',
               data=tips[tips.tip_pct < 0.5])

이번에는 bar 형태가 아닌 box 형태로 나타냈습니다.