ㅅㅇ

matplotlib_ 02_1 각종 그래프 그리기 _ 선 그래프 (line Graph) 본문

AI_STUDY/데이터 시각화 Matplotlib Seaborn Pandas

matplotlib_ 02_1 각종 그래프 그리기 _ 선 그래프 (line Graph)

SO__OS 2022. 6. 15. 23:58
플레이데이터 빅데이터캠프 공부 내용 _ 6/15

Pandas_ 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 = '  '

 

Line-style reference — Matplotlib 3.0.3 documentation

Note Click here to download the full example code Line-style reference Reference for line-styles included with Matplotlib. import numpy as np import matplotlib.pyplot as plt color = 'cornflowerblue' points = np.ones(5) # Draw 5 points for each line text_st

matplotlib.org

 

- 위 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 공간의 위쪽 왼쪽

 

 

plt.legend(loc = 'upper left')                              plt.legend(loc = 'upper center')                                  plt.legend(loc = 'upper right')

 

plt.legend(loc = 'center left')                             plt.legend(loc = 'center')                                          plt.legend(loc = 'center right')
plt.legend(loc = 'lower left')                               plt.legend(loc = 'lower center')                              plt.legend(loc = 'lower right')

 


(2) 자유롭게 원하는 위치를 지정 : bbox_to_anchor,  loc  두 개 매개변수 이용


    - bbox_to_anchor : legend box의 Axes상의 위치  (상하, 좌우)

        - (상하, 좌우)
        - 전체 Axes(subplot)기준
            - 상단 : (0,1) (1,1)
            - 하단 : (0,0) (1,0)

* loc = 'lower left' 로 설정되어 있음.

 

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