[Matplotlib] python으로 멋드러진 그래프 그리기

Matlab으로 데이터 시각화하기

데이터를 보기좋게 표현해봅시다.

1. Matplotlib 시작하기

2. 자주 사용되는 Plotting의 Options

I. Matplotlib 시작하기

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()

png

plt.figure(figsize=(6,6))
plt.plot([0,1,2,3,4])
plt.show()

png

2차 함수 그래프 with plot()

# 리스트를 이용해서 1차함수 y=x 를 그려보면
plt.plot([0,1,2,3,4])
plt.show()

png

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()

png

# 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()

png

# 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()

png

# 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()

png

# 그래프에 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()

png

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()

png

# 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()

png

산점도 (Scatter plot)

plt.scatter(x,y)
plt.show()

png

Box plot

plt.boxplot((x,y))
plt.title('Box plot of $x, y$')
plt.show()

png

막대 그래프 (bar plot)

plt.bar(x,y) # 확률변수, 빈도
plt.show()

png

# xticks를 올라를게 처리 해보기

plt.bar(x,y) # 확률변수, 빈도
plt.xticks([i for i in range(0, 21, 1)])
plt.show()

png

cf) Historam

plt.hist(y, bins=np.arange(0,20,2))
plt.xticks(np.arange(0,20,2))
plt.show()

png

원형 그래프 (Pie chart)

z = [100, 200, 300, 400]

plt.pie(z, labels=['one', 'two', 'three','four'])
plt.show()

png

IV. The 멋진 그래프, Seaborn Case Study

Seaborn Import 하기

import seaborn as sns

커널 밀도 그림 (Kernel Density Plot)

# 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()

png

# kdeplot

sns.kdeplot(y, shade=True)
plt.show()

png

히스토그램의 분포가 연속적으로 나타내어 졌다.

카운트 그림 (Count Plot)

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()

png

# sns의 countplot
sns.countplot(x = vote_df['vote'])
plt.show()

png

캣그림 (Cat plot)

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);

png

s = sns.catplot(x='WHO Region' , y='Confirmed' , data=covid, kind='violin')
s.fig.set_size_inches(10,6);

png

스트립그림(Strip Plot)

sns.stripplot(x = 'WHO Region', y= 'Recovered', data=covid)

png

# cf) swamplot
# 겹치는 점들을 옆으로 분산하여 표시 해 준다.

s = sns.swarmplot(x = 'WHO Region', y= 'Recovered', data=covid);

png

히트맵 (headmap)

# 히트맵 예제
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())

png