본문 바로가기
self.python

[python] matplot 그래프 그리기 유용한 꿀팁! - (2)

by 톤토니 2022. 6. 13.
반응형

matplot

[python] matplot 그래프 그리기 유용한 꿀팁! 

 

 

여러 그래프 x, y 좌표 범위 통일하기

여러 그래프 x, y 축 맨 끝만 표시하기

그래프 마커, 색깔 설정하기

x, y 축 범위 설정하기

x, y축 글씨 숨기기(tick 없애기)

데이터 라벨링 하기 & 위치 조정하기

그래프 title 작성하기

y축에 텍스트 쓰기

축 글씨 방향 변경하기

여러 그래프간의 간격 조절하기(상하좌우)

 

 

- 이전 글에서...

2022.06.12 - [self.python] - [python] matplot 그래프 그리기 유용한 꿀팁! - (1)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

score = {'Year' : ['2016', '2017', '2018', '2019', '2020', '2021', '2022'],
            'Mary': [90, 68, 70, 80, 92, 68, 78],
            'Kate': [90, 68, 70, 80, 92, 68, 78],
            'Mark': [39, 59, 60, 73, 84, 87, 92],
            'Maxi': [83, 92, 71, 56, 79, 93, 85]}

df = pd.DataFrame(score)

fig, ax = plt.subplots(2, 2, figsize=(11,8), sharex=True, sharey=True)

color = ['steelblue', 'mediumaquamarine', 'grey', 'darksalmon']

x = df['Year'].tolist()
j = 1

for i in range(2):
    for k in range(2):
        y = df.iloc[:, j]
        y = y.tolist()
        ax[i][k].plot(x, y, marker='o', color=color[j-1])
        
        
        ax[i][k].set_ylim(35, 105)
        ax[i][k].axes.yaxis.set_ticks([])
        ax[i][k].axes.xaxis.set_ticks([])
           
        j = j +1
        
        for l in range(len(df)):
            ax[i][k].text(x[l], y[l]+3, y[l])
  
plt.show()

 

 

 

 

 

- 그래프 title 쓰기

그래프 전체에 대한 제목은 suptitle, 각각의 sub plot에 대한 제목은 set_title로 지정해주면 된다.

fig, ax = plt.subplots(2, 2, figsize=(11,8), sharex=True, sharey=True)

color = ['steelblue', 'mediumaquamarine', 'grey', 'darksalmon']

x = df['Year'].tolist()
j = 1

name = df.columns # sub plot 마다 각 학생의 이름으로 title 설정을 위해서 name이라는 리스트 선언

for i in range(2):
    for k in range(2):
        y = df.iloc[:, j]
        y = y.tolist()
        ax[i][k].plot(x, y, marker='o', color=color[j-1])
        
        
        ax[i][k].set_ylim(35, 105)
        ax[i][k].axes.yaxis.set_ticks([])
        ax[i][k].axes.xaxis.set_ticks([])
           
        ax[i][k].set_title(name[j]) # 각 그래프마다 학생 이름을 가져온다.
        
        j = j +1
        
        for l in range(len(df)):
            ax[i][k].text(x[l], y[l]+3, y[l])

plt.suptitle('SCORE', fontsize = 30) # 이 그래프 전체에 대한 title
plt.show()

이렇게 전체에 대한 제목 'SCORE' 와 각각 plot에 대한 학생의 이름으로 title이 잘 설정되었음을 확인할 수 있다.

 

 

 

 

- subplot 그래프 간의 간격 조절하기

 

subplot의 여러 그래프가 tick도 없으니 좀 더 붙어있으면 보기 좋을 것 같다.

이런경우 plt.subplots_adjust(wspace = 0, hspace = 0) 으로 간격을 조정할 수 있다.

plt.subplots_adjust(wspace=0, hspace=0)

너비와 높이의 space 를 모두 0으로 주니 그래프끼리 딱 붙어버린 것을 볼 수 있다.

너비는 딱 붙이고 높이만 조금 떨어뜨려놓고 싶으면 hspace의 값을 조금 높여주면 된다.

plt.subplots_adjust(wspace=0, hspace=0.1)

hspace = 0.1 로 하니 딱 적당해보인다. 너비의 간격을 조정하고 싶으면 wsapce를 조정하면 된다.

 

 

 

 

- 그래프 두 줄에서 각 줄에 글자를 붙여보자. set_ylabel(글자, 회전, 그래프와 간격, 글자 사이즈)

 

윗 줄 학생들은 'top', 아래 줄 학생들은 'bottom' 이라는 글자를 붙여보자.

ylabel = ['top', 'bottom'] # 반복문 바깥쪽에
 if k == 0 :
            ax[i][k].set_ylabel(ylabel[i], rotation = 0, labelpad = 50, fontsize = 25)

 

두 번째 반복문 안에 k == 0 일때, ylabel을 붙인다면 [0][0] 그래프와, [1][0] 그래프에만 ylabel이 붙게 된다.

labelpad는 글자와 그래프간의 간격이다. 값을 낮추면 글자와 그래프가 겹칠 수 있다. 적당히 조정하면 된다.

 

 

 

 

 

 

 

- 글자의 방향을 바꿔보자. rotation

 

rotation은 방향을 변경하는 것이다. 글자를 수직으로 바꾸면 labelpad의 값을 더 낮출 수 있을 것 같다.

 

if k == 0 :
            ax[i][k].set_ylabel(ylabel[i], rotation = 90, labelpad = 10, fontsize = 25)

 

 

총 정리

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

score = {'Year' : ['2016', '2017', '2018', '2019', '2020', '2021', '2022'],
            'Mary': [90, 68, 70, 80, 92, 68, 78],
            'Kate': [90, 68, 70, 80, 92, 68, 78],
            'Mark': [39, 59, 60, 73, 84, 87, 92],
            'Maxi': [83, 92, 71, 56, 79, 93, 85]}

df = pd.DataFrame(score) # 데이터프레임 형성

name = df.columns

fig, ax = plt.subplots(2, 2, figsize=(11,8), sharex=True, sharey=True)

color = ['steelblue', 'mediumaquamarine', 'grey', 'darksalmon']
ylabel = ['top', 'bottom']

x = df['Year'].tolist()

j = 1

for i in range(2):
    for k in range(2):
        y = df.iloc[:, j]
        y = y.tolist()
        ax[i][k].plot(x, y, marker='o', color=color[j-1])
        
        
        ax[i][k].set_ylim(35, 105)
        ax[i][k].axes.yaxis.set_ticks([])
        ax[i][k].axes.xaxis.set_ticks([])
           
        ax[i][k].set_title(name[j]) # subplot 각각의 제목 설정
        
        if k == 0 : # 각 그래프 줄의 ylabel 설정
            ax[i][k].set_ylabel(ylabel[i], rotation = 90, labelpad = 10, fontsize = 25)
        
        j = j +1
        
        for l in range(len(df)):
            ax[i][k].text(x[l], y[l]+3, y[l])

plt.suptitle('SCORE', fontsize = 30) # 그래프 전체의 제목 설정
plt.subplots_adjust(wspace=0, hspace=0.1) # 각 그래프간의 간격 설정
plt.show()

 

지금은 의미없는 데이터로 해서 이렇게 그래프를 그려도 의미가 없지만...

다른 데이터로 유용하게 사용했던 기능들이다. 필요한 기능들을 적절히 사용할 수 있다면 훨씬 보기좋은 그래프를 그릴 수 있을것이다.

 

 

 

반응형

댓글