ㅅㅇ
matplotlib_ 02_1 각종 그래프 그리기 _ 선 그래프 (line Graph) 본문
matplotlib_ 02_1 각종 그래프 그리기 _ 선 그래프 (line Graph)
SO__OS 2022. 6. 15. 23:58Pandas_ 02_1 각종 그래프 그리기 _ 선 그래프 (line Graph)
Line Graph 선 그래프 (꺽은선 그래프)
- 점과 점을 선으로 연결한 그래프
- 시간의 흐름에 따른 변화를 표현할 때 많이 사용한다. (시계열)
cf ) 산점도는 순서 흐름을 시각적으로 파악할 수 없다.
- plot([x], y)
- 1번인수 : x값(생략가능), 2번인수 y값
- 인수가 하나인 경우 y 축의 값으로 설정되고 X값은 (0 ~ len(y)-1) 범위로 지정된다.
- x,y 의 인수는 리스트 형태의 객체들을 넣는다.
- 리스트
- 튜플
- numpy 배열 (ndarray)
- 판다스 Series
- x와 y의 size는 같아야 한다.
- 하나의 axes(subplot)에 여러 개의 선 그리기
- 같은 axes에 plot()를 여러번 실행한다. label 범례명 지정해주기.
1. 선 그래프 (Line Graph) 그리기
- 기본 예제
import matplotlib.pyplot as plt
plt.plot(range(1, 20, 5), range(10, 30, 5))
plt.show()
- X 과 Y의 size는 같아야 한다.
x = range(1, 11)
y = pd.Series(range(10, 110, 10))
print(len(x), len(y)) # x과 y의 size는 같아야 한다.
- X 값 생략한다면,
plt.figure(figsize = (5,5))
plt.plot([3,4,5])
plt.show()
- 그래프 눈금값 tick 은 ?
tick 기본값 : y축의 min과 max에 따라 min 근처값 ~ max 근처값 으로 알아서 지정됨.
2. 선 스타일 linestyle = ' '
- 위 url 페이지에서
- defalut 기본값: 직선 linestyle = ' : ' linestyle = ' -. ' linestyle = ' -- '
plt.plot(x축값, y축값, [label], [linestyle])
EX.
import matplotlib.pyplot as plt
import pandas as pd
x = range(1, 11)
y = pd.Series(range(10, 110, 10)) # 원소별로 계산하려고 Series로 만들어줌.
y2 = y + 5
y3 = y + 10
y4 = y + 15
# (x축값, y축값, [label], [linestyle])
plt.plot(x, y, label = 'y') # linestyle default
plt.plot(x, y2, label = 'y+5', linestyle = ':')
plt.plot(x, y3, label = 'y+10', linestyle = '-.')
plt.plot(x, y4, label = 'y+15', linestyle = '--')
plt.legend() # 범례
plt.show()
3. 선 그래프 활용 _ 기본 예제로 익히기
예제와 같이 주로 시간의 흐름에 따른 값의 변화를 볼 때 쓰인다.
주로, x축 : 시간 y축 : 값
1) 년도 흐름에 따른 최대농도의 변화량
plt.figure(figsize=(10,6)) # 보통 x축 가로가 길게 y축은 짧게
plt.plot(df['년도'], df['최대농도'])
# axes 제목
plt.title('연도별 황사 최대농도 변화량')
# x,y 축 label
plt.xlabel('측정년도')
plt.ylabel('황사최대농도')
plt.show()
2) 년도 별 관측일수의 변화량
plt.figure(figsize = (7,5))
plt.plot(df["년도"], df['관측일수'], c = 'g')
plt.title('년도별 관측일수의 변화량', fontsize='20', c = 'b')
plt.xlabel('측정년도', c = 'red')
plt.ylabel('관측일수')
plt.show()
3) 하나의 figure 내에의 다른 axes(subplot) 에 각각 그리기.
fig = plt.figure(figsize= (20, 6))
# figure의 title
fig.suptitle('년도별 각종 변화량', fontsize = 25)
plt.subplot(1,2,1)
plt.plot(df['년도'], df['최대농도'])
plt.title('년도별 최대농도 변화량') # axes 별 title
plt.xlabel('년도')
plt.ylabel('최대농도')
plt.subplot(1,2,2)
plt.plot(df['년도'], df['관측일수'])
plt.title('년도별 관측일수의 변화량') # axes 별 title
plt.xlabel('년도')
plt.ylabel('관측일수')
plt.tight_layout()
plt.show()
4. 선 그래프 활용 _ 하나의 axes(subplot)에 두개를 같이 그리기
- > 하나의 축을 공유하고 두개의 축을 가지는 그래프
두 컬럼(변수)의 값의 범위(scale)이 같거나 비슷한 경우만 한 axes에 그리는 것이 좋다.
그러나, 만약 지금 처럼 범위 차이가 많이 난다면, 아래와 같은 그래프가 나타난다.
이때, 하나의 축을 공유하고 두개의 축을 가지는 그래프를 작성해줘야 한다.!
- 값의 범위(Scale)이 다른 두 값과 관련된 선그래프를 한 Axes(subplot)에 그리는 경우.,
- X축을 공유해 2개의 Y축을 가지는 그래프
- axes.twinx() 를 이용해 axes를 복사 (객체지향 방식으로 해야 함.)
- Y축을 공유해 2개의 X축을 가지는 그래프
- axes.twiny() 를 이용해 axes를 복사 (객체지향 방식으로 해야 함.)
- 객체 지향 방식으로 subplot 만들기. txinx()로 axes 복사하기
좌우 양쪽 축이 생긴 것을 보았을 때, x축을 공유하는 axes가 복사되어 위에 겹치져있다는 것을 알 수 있다.
fig = plt.figure(figsize = (15, 5))
ax1 = fig.add_subplot(1,1,1)
ax2 = ax1.twinx()
EX. 최대 농도와 관측일 수의 연도별 변화를 시각화
X축을 공유해 2개의 Y축을 가지는 그래프 그리기.
- ax2 = ax1.twinx() : ax1과 x를 공유하며 위에 ax2를 합쳐 겹치게 만들어준다.
- 두 개의 axes가 겹쳐 있다. - > axes 각각 선 color를 지정해주자. (아니면 기본값 설정으로 둘 다 파랑)
fig = plt.figure(figsize=(15, 5))
# axes
ax1 = fig.add_subplot(1,1,1) #plt.gca() : AxesSubplot 반환. 한 그래프그릴땐 이렇게 해도 됨.
ax2 = ax1.twinx() # ax1과 x를 공유하며 위에 ax2를 합쳐 겹치게 만들어준다.
# plot
ax1.plot(df['년도'], df['최대농도'], label='최대농도', color='blue')
ax2.plot(df['년도'], df['관측일수'], label= '관측일수', color = 'g')
# x,y축 명 지정
ax1.set_xlabel('년도')
ax1.set_ylabel('최대농도', c='r')
ax2.set_ylabel('관측일수', c='r')
# 어차피 겹쳐 있으니 둘 중 하나 하던가 아님 figure title로 하던가
ax1.set_title('년도별 최대농도/관측일수 변화량')
plt.show()
# 최대농도의 변화량 흐름, 관측일수의 변화량 흐름을 시각적으로 파악할 수 있다.
위 그래프에서 legend 를 설정한다고 하자.
현재 두 그래프는 다른 axes이며, 이 두 axes는 딱 포개져 겹쳐져 있는 상태이다.
만약 별도의 설정을 안 하고 legend를 기본값으로 설정한다면 범례 legend 또한 겹쳐 쓰게 될 것이다.
그러므로, 아래의 방법으로 설정이 필요하다.
5. legend 위치 설정
(1) Axes 안의 정해지 위치(9곳)에 설정
loc = '상하위치 좌우위치' 박스 9 구간 셋팅 가능.(자유롭게 불가능)
- 상하 : lower, center, upper
- 좌우 : left, center, right
- 기본(def) : best (알아서 최적의 위치로)
- ax1.legend(loc = 'center') : 하나만 하면 상하 좌우 둘다 가운데
- ax1.legend(loc= 'upper left') : Axes 공간의 위쪽 왼쪽
(2) 자유롭게 원하는 위치를 지정 : bbox_to_anchor, loc 두 개 매개변수 이용
- bbox_to_anchor : legend box의 Axes상의 위치 (상하, 좌우)
- (상하, 좌우)
- 전체 Axes(subplot)기준
- 상단 : (0,1) (1,1)
- 하단 : (0,0) (1,0)
- loc : legend box의 기준위치(기준점이 될 위치 포인트)
bbow_to_anchor와 같이 쓰일 경우에는,
bbox_to_anchor에서 설정해준 좌표를
legend box의 어느 포인트 점이 위치해야 하는지 설정하는 것이다. (아홉 개의 포인트가 있다.)
- 상하 : lower, center, upper
- 좌우 : left, center, right
- > legend box의 loc을 Axes(Subplot)의 bbox_to_anchor에 위치
- ax1.legend(bbox_to_anchor=(1,1), loc = 'upper left') 을 주로 쓴다.
- 같은 bbox_to_anchor 좌표이여도, 기준점이 될 loc 설정이 다르다면,
plt.legend(bbox_to_anchor=(1,0.5), loc = 'lower left')
plt.legend(bbox_to_anchor=(1,0.5), loc = 'lower center')
plt.legend(bbox_to_anchor=(1,0.5), loc = 'lower right')
- 1 이상의 값으로 설정한다면,
- 위 예제 년도별 최대농도/관측일수 변화량 그래프에서 legend 설정해준다면,
fig = plt.figure(figsize=(15, 5))
ax1 = fig.add_subplot(1,1,1)
ax2 = ax1.twinx()
ax1.plot(df['년도'], df['최대농도'], label='최대농도', color='blue')
ax2.plot(df['년도'], df['관측일수'], label= '관측일수', color = 'g')
ax1.set_xlabel('년도')
ax1.set_ylabel('최대농도', c='r')
ax2.set_ylabel('관측일수', c='r')
ax1.set_title('년도별 최대농도/관측일수 변화량')
# 범례위치.
ax1.legend(bbox_to_anchor=(1.04,1), loc = 'upper left')
ax2.legend(bbox_to_anchor=(1.04,0.94), loc = 'upper left')
plt.show()
'AI_STUDY > 데이터 시각화 Matplotlib Seaborn Pandas' 카테고리의 다른 글
matplotlib_ 02_4 각종 그래프 그리기 _ 파이차트 (Pie Chart) (0) | 2022.06.16 |
---|---|
matplotlib_ 02_3 각종 그래프 그리기 _ 막대그래프(Bar plot) (0) | 2022.06.16 |
matplotlib_ 02_2 각종 그래프 그리기 _ 산점도 (Scatter Plot) (0) | 2022.06.16 |
matplotlib_ 01 개요 & 설정값 (0) | 2022.06.15 |
matplotlib_ 00 한글처리 (0) | 2022.06.14 |