[Matplotlib] python으로 멋드러진 그래프 그리기
Written by
metterian
on
on
Matlab으로 데이터 시각화하기
데이터를 보기좋게 표현해봅시다.
1. Matplotlib 시작하기
2. 자주 사용되는 Plotting의 Options
- 크기 :
figsize
- 제목 :
title
- 라벨 :
_label
- 눈금 :
_tics
- 범례 :
legend
3. Matplotlib Case Study
- 꺾은선 그래프 (Plot)
- 산점도 (Scatter Plot)
- 박스그림 (Box Plot)
- 막대그래프 (Bar Chart)
- 원형그래프 (Pie Chart)
4. The 멋진 그래프, seaborn Case Study
- 커널밀도그림 (Kernel Density Plot)
- 카운트그림 (Count Plot)
- 캣그림 (Cat Plot)
- 스트립그림 (Strip Plot)
- 히트맵 (Heatmap)
I. Matplotlib 시작하기
- 파이썬의 데이터 시각화 라이브러리
- `%matplotilb inline을 통해서 활성화
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
II. Matplotlib Case Study
plt.plot([1,2,3,4,5]) # 실제 plotting을 하는 함수 # y= x+ 1
plt.show()
plt.figure(figsize=(6,6))
plt.plot([0,1,2,3,4])
plt.show()
2차 함수 그래프 with plot()
# 리스트를 이용해서 1차함수 y=x 를 그려보면
plt.plot([0,1,2,3,4])
plt.show()
x = np.arange(-10, 10, 0.01) # 정의역
x[:5]
array([-10. , -9.99, -9.98, -9.97, -9.96])
plt.plot(x, x**2)
plt.show()
# x, y 축에 설명 추가 하기
x = np.arange(-10, 10, 0.01)
plt.xlabel('x value')
plt.ylabel("$f(x)$ value")
plt.plot(x, x**2)
plt.show()
# x,y 축의 범위를 설정하기
x = np.arange(-10, 10, 0.01)
plt.xlabel('x value')
plt.ylabel("$f(x)$ value")
# 추가
plt.axis([-5, 5, 0, 25]) #[x_min, x_max, y_min, y_max]
plt.plot(x, x**2)
plt.show()
# x,y 축에 눈금 수정하기
x = np.arange(-10, 10, 0.01)
plt.xlabel('x value')
plt.ylabel("$f(x)$ value")
plt.axis([-5, 5, 0, 25])
plt.xticks([i for i in range(-5,6,1)]) # x 축의 눈금 설정
plt.yticks([i for i in range(0, 10,3)]) # y 축의 눈금 설정
plt.plot(x, x**2)
plt.show()
# 그래프에 title 달기
x = np.arange(-10, 10, 0.01)
plt.xlabel('x value')
plt.ylabel("$f(x)$ value")
plt.axis([-5, 5, 0, 25])
plt.xticks([i for i in range(-5,6,1)]) # x 축의 눈금 설정
plt.yticks([i for i in range(0, 27,3)]) # y 축의 눈금 설정
plt.title("$y = x^2$ graph")
plt.plot(x, x**2, label="trend")
plt.legend()
plt.show()
III. Matplotlib Case Study
꺽은선 그래프 (plot)
x = np.arange(20) # 0~19
y = np.random.randint(0,22, 20) # 0~21 까지 20번 생성
x,y
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19]),
array([ 0, 9, 1, 7, 10, 0, 6, 18, 5, 6, 20, 18, 8, 16, 17, 15, 16,
12, 0, 14]))
plt.plot(x,y)
plt.show()
# Extra: y축을 20까지 보이가 하고 싶다면? , y축을 5단윌 보이게 하고 싶다면?
x = np.arange(20) # 0~19
y = np.random.randint(0,22, 20) # 0~21 까지 20번 생성
plt.plot(x,y)
plt.axis([0,21, 0, 22])
plt.yticks([i for i in range(0, 21, 5)])
plt.show()
산점도 (Scatter plot)
plt.scatter(x,y)
plt.show()
Box plot
- 수치형 데이터에 대한 정도 Q1, Q2, Q3, min, max
plt.boxplot((x,y))
plt.title('Box plot of $x, y$')
plt.show()
막대 그래프 (bar plot)
- 범주형 데이터의 “값”과 그 값의 크기를 직사각형으로 나타낸 그림
plt.bar(x,y) # 확률변수, 빈도
plt.show()
# xticks를 올라를게 처리 해보기
plt.bar(x,y) # 확률변수, 빈도
plt.xticks([i for i in range(0, 21, 1)])
plt.show()
cf) Historam
hist()
- 도수분포를 직사각형의 막대 형태로 나타냈다.
- “계급” -> 그룹화로 나타낸 것이 특징: 0,1,2가 아니라 0~2까지의 범주형 데이터로 구성후 그림을 그림
plt.hist(y, bins=np.arange(0,20,2))
plt.xticks(np.arange(0,20,2))
plt.show()
원형 그래프 (Pie chart)
pie()
- 데이터 전체에 대한 부분의 비율을 부채꼴로 나타낸 그래프
- 다른 그래프에 비해서 비율 확인에 용이
z = [100, 200, 300, 400]
plt.pie(z, labels=['one', 'two', 'three','four'])
plt.show()
IV. The 멋진 그래프, Seaborn Case Study
Seaborn Import 하기
import seaborn as sns
커널 밀도 그림 (Kernel Density Plot)
- 히스토그램과 같은 연속적인 분포를 곡선과 해서 그린 그림
sns.kdeplot()
# in Histogram
x = np.arange(0,22,2)
y = np.random.randint(0,20, 20)
plt.hist(y, bins=x)
plt.xticks(range(0,22,2))
plt.show()
# kdeplot
sns.kdeplot(y, shade=True)
plt.show()
히스토그램의 분포가 연속적으로 나타내어 졌다.
카운트 그림 (Count Plot)
- 범주형 column의 빈도수를 시각화 $\rightarrow$ groupby 후 도수를 하는 것과 동일한 효과
sns.countplot()
vote_df = pd.DataFrame({"name": ['Andy', 'Bob','Cat' ], 'vote': [True, True, False]})
vote_df
name | vote | |
---|---|---|
0 | Andy | True |
1 | Bob | True |
2 | Cat | False |
# in matplotlib barplot
vote_count = vote_df.groupby('vote').count()
vote_count
name | |
---|---|
vote | |
False | 1 |
True | 2 |
plt.bar(x=[False, True], height=vote_count['name'])
plt.show()
# sns의 countplot
sns.countplot(x = vote_df['vote'])
plt.show()
캣그림 (Cat plot)
- 여기서 cat은 concat에서 유래
- 숫자형 변수와 하나 이상의 범주형 변수의 관계를 보여주는 함수
sns.catplot()
covid = pd.read_csv('data/country_wise_latest.csv')
covid.head(3)
</style>
Country/Region | Confirmed | Deaths | Recovered | Active | New cases | New deaths | New recovered | Deaths / 100 Cases | Recovered / 100 Cases | Deaths / 100 Recovered | Confirmed last week | 1 week change | 1 week % increase | WHO Region | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Afghanistan | 36263 | 1269 | 25198 | 9796 | 106 | 10 | 18 | 3.50 | 69.49 | 5.04 | 35526 | 737 | 2.07 | Eastern Mediterranean |
1 | Albania | 4880 | 144 | 2745 | 1991 | 117 | 6 | 63 | 2.95 | 56.25 | 5.25 | 4171 | 709 | 17.00 | Europe |
2 | Algeria | 27973 | 1163 | 18837 | 7973 | 616 | 8 | 749 | 4.16 | 67.34 | 6.17 | 23691 | 4282 | 18.07 | Africa |
</div>
s = sns.catplot(x='WHO Region' , y='Confirmed' , data=covid) # catplot의 kind의 default 값은 strip이기 떄문에 기본적으로 strip grip plot을 그린다.
s.fig.set_size_inches(10,6);
s = sns.catplot(x='WHO Region' , y='Confirmed' , data=covid, kind='violin')
s.fig.set_size_inches(10,6);
스트립그림(Strip Plot)
- scatter plot과 유사하게 데이터의 수치를 표현하는 그래프
sns.stripplot()
sns.stripplot(x = 'WHO Region', y= 'Recovered', data=covid)
# cf) swamplot
# 겹치는 점들을 옆으로 분산하여 표시 해 준다.
s = sns.swarmplot(x = 'WHO Region', y= 'Recovered', data=covid);
히트맵 (headmap)
- 데이터의 행렬을 색상으로 표현 해주는 그래프
sns.heatmap()
# 히트맵 예제
covid.corr()
</style>
Confirmed | Deaths | Recovered | Active | New cases | New deaths | New recovered | Deaths / 100 Cases | Recovered / 100 Cases | Deaths / 100 Recovered | Confirmed last week | 1 week change | 1 week % increase | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Confirmed | 1.000000 | 0.934698 | 0.906377 | 0.927018 | 0.909720 | 0.871683 | 0.859252 | 0.063550 | -0.064815 | 0.025175 | 0.999127 | 0.954710 | -0.010161 |
Deaths | 0.934698 | 1.000000 | 0.832098 | 0.871586 | 0.806975 | 0.814161 | 0.765114 | 0.251565 | -0.114529 | 0.169006 | 0.939082 | 0.855330 | -0.034708 |
Recovered | 0.906377 | 0.832098 | 1.000000 | 0.682103 | 0.818942 | 0.820338 | 0.919203 | 0.048438 | 0.026610 | -0.027277 | 0.899312 | 0.910013 | -0.013697 |
Active | 0.927018 | 0.871586 | 0.682103 | 1.000000 | 0.851190 | 0.781123 | 0.673887 | 0.054380 | -0.132618 | 0.058386 | 0.931459 | 0.847642 | -0.003752 |
New cases | 0.909720 | 0.806975 | 0.818942 | 0.851190 | 1.000000 | 0.935947 | 0.914765 | 0.020104 | -0.078666 | -0.011637 | 0.896084 | 0.959993 | 0.030791 |
New deaths | 0.871683 | 0.814161 | 0.820338 | 0.781123 | 0.935947 | 1.000000 | 0.889234 | 0.060399 | -0.062792 | -0.020750 | 0.862118 | 0.894915 | 0.025293 |
New recovered | 0.859252 | 0.765114 | 0.919203 | 0.673887 | 0.914765 | 0.889234 | 1.000000 | 0.017090 | -0.024293 | -0.023340 | 0.839692 | 0.954321 | 0.032662 |
Deaths / 100 Cases | 0.063550 | 0.251565 | 0.048438 | 0.054380 | 0.020104 | 0.060399 | 0.017090 | 1.000000 | -0.168920 | 0.334594 | 0.069894 | 0.015095 | -0.134534 |
Recovered / 100 Cases | -0.064815 | -0.114529 | 0.026610 | -0.132618 | -0.078666 | -0.062792 | -0.024293 | -0.168920 | 1.000000 | -0.295381 | -0.064600 | -0.063013 | -0.394254 |
Deaths / 100 Recovered | 0.025175 | 0.169006 | -0.027277 | 0.058386 | -0.011637 | -0.020750 | -0.023340 | 0.334594 | -0.295381 | 1.000000 | 0.030460 | -0.013763 | -0.049083 |
Confirmed last week | 0.999127 | 0.939082 | 0.899312 | 0.931459 | 0.896084 | 0.862118 | 0.839692 | 0.069894 | -0.064600 | 0.030460 | 1.000000 | 0.941448 | -0.015247 |
1 week change | 0.954710 | 0.855330 | 0.910013 | 0.847642 | 0.959993 | 0.894915 | 0.954321 | 0.015095 | -0.063013 | -0.013763 | 0.941448 | 1.000000 | 0.026594 |
1 week % increase | -0.010161 | -0.034708 | -0.013697 | -0.003752 | 0.030791 | 0.025293 | 0.032662 | -0.134534 | -0.394254 | -0.049083 | -0.015247 | 0.026594 | 1.000000 |
</div>
sns.heatmap(covid.corr())