함께하는 데이터 분석

[Python] Matplotlib 그래프에 텍스트 삽입 본문

데이터분석 공부/Python

[Python] Matplotlib 그래프에 텍스트 삽입

JEONGHEON 2022. 3. 30. 22:31

안녕하세요!

 

오늘은 지금까지 그렸던

 

한 개의 선 그래프나 여러 개의 선 그래프에

 

텍스트를 삽입하는 것을 알아보겠습니다.

 

그래프는 전 포스트에 작성한 코드를 그대로 가져올 것입니다.

 

각각의 그래프에 y값을 보기 쉽게 넣어주도록 할게요.

 

 

한 개의 선 그래프에 텍스트 삽입

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

 

import matplotlib.pyplot as plt
plt.rc('font', family = 'AppleGothic') # mac 
# plt.rc('font', family = 'Malgun Gothic') # window
plt.rc('font', size = 12)
plt.rc('axes', unicode_minus = False) # -표시 오류 잡아줌

위 두 코드블럭에 있는 내용들은 너무 많이 말씀드려서

 

생략하고 넘어가겠습니다.

 

처음 보시는 분들은 이전 포스트를 참고하시면 될 것 같습니다.

 

x = [i for i in range(1, 11)]

random.seed(42)
y=[]
for i in range(1,11):
    z=random.randint(10,21)
    y.append(z)
print(y)
>>> [20, 11, 10, 21, 14, 13, 13, 12, 21, 11]

 

plt.figure(figsize = (10, 5), facecolor = 'aqua')
plt.plot(x, y, marker = 'v', ls = '-.', mec = 'indigo', \
mfc = 'green', color = 'purple', ms = 15, alpha = 0.5)
plt.show()

전 포스트에 그린 이 그래프에 각각의 마커에

 

y값을 텍스트로 삽입해주겠습니다.

 

 

y값 텍스트 삽입

plt.figure(figsize = (10, 5), facecolor = 'aqua')
plt.plot(x, y, marker = 'v', ls = '-.', \
mec = 'indigo', mfc = 'green', color = 'purple', ms = 15, alpha = 0.5)
for i, j in enumerate(y) :
    plt.text(x[i], y[i], j)
plt.show()

for문을 사용하여 enumerate에 y를 넣고

 

plt.text를 사용하여 x와 y에 인덱스를 부여하고

 

y값을 삽입한 코드입니다.

 

이때 글씨가 마커와 겹쳐 알아보기가 쉽지 않죠.

 

그렇다면 텍스트를 조금 위로 올려볼까요?

 

 

텍스트 위로 올리기

plt.figure(figsize = (10, 5), facecolor = 'aqua')
plt.plot(x, y, marker = 'v', ls = '-.', \
mec = 'indigo', mfc = 'green', color = 'purple', ms = 15, alpha = 0.5)
for i, j in enumerate(y) :
    plt.text(x[i], y[i] + 0.5, j)
plt.show()

y부분에 + 0.5를 사용하여 올려준 것을 확인할 수 있습니다.

 

0.5라는 숫자는 y축의 값을 보고 넣어준 것입니다.

 

y축의 크기를 보고 상황에 맞게 조절해주시면 됩니다.

 

이번에는 텍스트가 x값보다 오른쪽에 치우쳐있어서

 

가운데로 센터링 해주겠습니다.

 

 

텍스트 센터링

plt.figure(figsize = (10, 5), facecolor = 'aqua')
plt.plot(x, y, marker = 'v', ls = '-.', \
mec = 'indigo', mfc = 'green', color = 'purple', ms = 15, alpha = 0.5)
for i, j in enumerate(y) :
    plt.text(x[i], y[i] + 0.5, j, ha = 'center')
plt.show()

plt.text의 ha인자에 center를 넣어줌으로써

 

텍스트가 센터링 된 것을 볼 수 있습니다.

 

이번에는 텍스트의 색깔을 바꿔주겠습니다.

 

 

텍스트 색깔 변경

plt.figure(figsize = (10, 5), facecolor = 'aqua')
plt.plot(x, y, marker = 'v', ls = '-.', \
mec = 'indigo', mfc = 'green', color = 'purple', ms = 15, alpha = 0.5)
for i, j in enumerate(y) :
    plt.text(x[i], y[i] + 0.5, j, ha = 'center', color = 'red')
plt.show()

색깔을 변경해주는 것은 보시다시피 간단합니다.

 

color에 원하는 색깔을 넣어주시면 됩니다.

 

이번에는 텍스트를 회전해볼까요?

 

 

텍스트 회전하기

plt.figure(figsize = (10, 5), facecolor = 'aqua')
plt.plot(x, y, marker = 'v', ls = '-.', \
mec = 'indigo', mfc = 'green', color = 'purple', ms = 15, alpha = 0.5)
for i, j in enumerate(y) :
    plt.text(x[i], y[i] + 0.5, j, ha = 'center', color = 'red', rotation = 60)
plt.show()

회전하다를 영어로 한 rotation을 활용하면 

 

텍스트가 회전하는 것을 볼 수 있습니다.

 

수치를 바꾸면 여러 방향으로 돌아가니

 

해보시는 것을 추천합니다.

 

마지막으로 텍스트에 테두리 상자를 넣어볼까요?

 

 

텍스트에 테두리 상자 넣기

box = {'boxstyle': 'square',
       'ec': (0.3, 1.0, 0.2),
       'fc': (0.8, 1.0, 0.3),
       'ls': ':',
       'lw': 3}

plt.figure(figsize = (10, 5), facecolor = 'aqua')
plt.plot(x, y, marker = 'v', ls = '-.', \
mec = 'indigo', mfc = 'green', color = 'purple', ms = 15, alpha = 0.5)
for i, j in enumerate(y) :
    plt.text(x[i], y[i] + 0.5, j, ha = 'center', color = 'red', rotation = 60, bbox = box)
plt.show()

box라는 딕셔너리를 만들었습니다.

 

boxstyle을 사각형으로 설정했고

 

전에 했던 것처럼 ec는 edgecolor의 약자이고

 

fc는 facecolor의 약자, ls는 linestyle 마지막으로

 

lw는 linewidth의 약자입니다.

 

딕셔너리를 만든 다음

 

plt.text의 bbox에 넣어주시면 됩니다.

 

그럼 이번에는 위와 똑같은 과정으로

 

여러 개의 선 그래프에 텍스트를 삽입해보겠습니다.

 

 

여러 개의 선 그래프에 텍스트 삽입

# 년도
year = [2018, 2019, 2020, 2021, 2022]

# 만명 단위
physics = [6.2,6.3 ,6.0 ,5.9 ,6.8] 
chemistry = [10.6,9.4 ,8.0 ,8.0 ,8.0]
life = [16.1,16.3 ,13.9 ,13.1 ,14.7]
earth = [16.7,17.7 ,16.1 ,13.0 ,14.9]

 

plt.figure(figsize = (10, 5))
plt.title('수능 과학탐구 응시자 수')
plt.xlabel('학년도')
plt.ylabel('응시자 수(단위 : 만명)')
plt.plot(year, physics, marker = 'o', ms = 10, ls = '-', label = '물리학')
plt.plot(year, chemistry, marker = 'd', ms = 10, ls = '-.', label = '화학')
plt.plot(year, life, marker = 'v', ms = 10, ls = '--', label = '생명과학')
plt.plot(year, earth, marker = 'x', ms = 10, ls = ':', label = '지구과학')
plt.legend(ncol = 4, loc = (0.3, 0.9))
plt.show()

여기까지가 전 포스트에서 작성한

 

최근 5개년 수능 과학탐구 별 응시자 수입니다.

 

이제 텍스트를 삽입해볼까요?

 

 

y값 텍스트 삽입

plt.figure(figsize = (10, 5))
plt.title('수능 과학탐구 응시자 수')
plt.xlabel('학년도')
plt.ylabel('응시자 수(단위 : 만명)')
plt.plot(year, physics, marker = 'o', ms = 10, ls = '-', label = '물리학')
plt.plot(year, chemistry, marker = 'd', ms = 10, ls = '-.', label = '화학')
plt.plot(year, life, marker = 'v', ms = 10, ls = '--', label = '생명과학')
plt.plot(year, earth, marker = 'x', ms = 10, ls = ':', label = '지구과학')
for i, j in enumerate(physics) :
    plt.text(year[i], physics[i], j)
for i, j in enumerate(chemistry) :
    plt.text(year[i], chemistry[i], j)
for i, j in enumerate(life) :
    plt.text(year[i], life[i], j)
for i, j in enumerate(earth) : 
    plt.text(year[i], earth[i], j)
plt.legend(ncol = 4, loc = (0.3, 0.9))
plt.show()

이렇게 앞에서 한 개의 선 그래프와 똑같이

 

각각의 plot에다 for문을 써주면 됩니다.

 

매우 간단하죠.

 

이제는 위에서 쓴 순서대로 각각의 텍스트에 스타일을 넣어주겠습니다.

 

 

텍스트 위로 올리기

plt.figure(figsize = (10, 5))
plt.title('수능 과학탐구 응시자 수')
plt.xlabel('학년도')
plt.ylabel('응시자 수(단위 : 만명)')
plt.plot(year, physics, marker = 'o', ms = 10, ls = '-', label = '물리학')
plt.plot(year, chemistry, marker = 'd', ms = 10, ls = '-.', label = '화학')
plt.plot(year, life, marker = 'v', ms = 10, ls = '--', label = '생명과학')
plt.plot(year, earth, marker = 'x', ms = 10, ls = ':', label = '지구과학')
for i, j in enumerate(physics) :
    plt.text(year[i], physics[i] + 0.5, j)
for i, j in enumerate(chemistry) :
    plt.text(year[i], chemistry[i] + 0.5, j)
for i, j in enumerate(life) :
    plt.text(year[i], life[i] + 0.5, j)
for i, j in enumerate(earth) : 
    plt.text(year[i], earth[i] + 0.5, j)
plt.legend(ncol = 4, loc = (0.3, 0.9))
plt.show()

 

텍스트 센터링

plt.figure(figsize = (10, 5))
plt.title('수능 과학탐구 응시자 수')
plt.xlabel('학년도')
plt.ylabel('응시자 수(단위 : 만명)')
plt.plot(year, physics, marker = 'o', ms = 10, ls = '-', label = '물리학')
plt.plot(year, chemistry, marker = 'd', ms = 10, ls = '-.', label = '화학')
plt.plot(year, life, marker = 'v', ms = 10, ls = '--', label = '생명과학')
plt.plot(year, earth, marker = 'x', ms = 10, ls = ':', label = '지구과학')
for i, j in enumerate(physics) :
    plt.text(year[i], physics[i] + 0.5, j, ha = 'center')
for i, j in enumerate(chemistry) :
    plt.text(year[i], chemistry[i] + 0.5, j, ha = 'center')
for i, j in enumerate(life) :
    plt.text(year[i], life[i] + 0.5, j, ha = 'center')
for i, j in enumerate(earth) : 
    plt.text(year[i], earth[i] + 0.5, j, ha = 'center')
plt.legend(ncol = 4, loc = (0.3, 0.9))
plt.show()

 

텍스트 색깔 변경

plt.figure(figsize = (10, 5))
plt.title('수능 과학탐구 응시자 수')
plt.xlabel('학년도')
plt.ylabel('응시자 수(단위 : 만명)')
plt.plot(year, physics, marker = 'o', ms = 10, ls = '-', label = '물리학')
plt.plot(year, chemistry, marker = 'd', ms = 10, ls = '-.', label = '화학')
plt.plot(year, life, marker = 'v', ms = 10, ls = '--', label = '생명과학')
plt.plot(year, earth, marker = 'x', ms = 10, ls = ':', label = '지구과학')
for i, j in enumerate(physics) :
    plt.text(year[i], physics[i] + 0.5, j, ha = 'center', color = 'blue')
for i, j in enumerate(chemistry) :
    plt.text(year[i], chemistry[i] + 0.5, j, ha = 'center', color = 'orange')
for i, j in enumerate(life) :
    plt.text(year[i], life[i] + 0.5, j, ha = 'center', color = 'green')
for i, j in enumerate(earth) : 
    plt.text(year[i], earth[i] + 0.5, j, ha = 'center', color = 'red')
plt.legend(ncol = 4, loc = (0.3, 0.9))
plt.show()

선의 색깔에 맞춰 텍스트 색깔도 바꿔줬습니다.

 

 

텍스트 회전하기

plt.figure(figsize = (10, 5))
plt.title('수능 과학탐구 응시자 수')
plt.xlabel('학년도')
plt.ylabel('응시자 수(단위 : 만명)')
plt.plot(year, physics, marker = 'o', ms = 10, ls = '-', label = '물리학')
plt.plot(year, chemistry, marker = 'd', ms = 10, ls = '-.', label = '화학')
plt.plot(year, life, marker = 'v', ms = 10, ls = '--', label = '생명과학')
plt.plot(year, earth, marker = 'x', ms = 10, ls = ':', label = '지구과학')
for i, j in enumerate(physics) :
    plt.text(year[i], physics[i] + 0.5, j, ha = 'center', color = 'blue', rotation = 30)
for i, j in enumerate(chemistry) :
    plt.text(year[i], chemistry[i] + 0.5, j, ha = 'center', color = 'orange', rotation = 60)
for i, j in enumerate(life) :
    plt.text(year[i], life[i] + 0.5, j, ha = 'center', color = 'green', rotation = -20)
for i, j in enumerate(earth) : 
    plt.text(year[i], earth[i] + 0.5, j, ha = 'center', color = 'red', rotation = -50)
plt.legend(ncol = 4, loc = (0.3, 0.9))
plt.show()

이렇게 rotation에는 -로 반대방향으로 회전시킬 수도 있습니다.

 

여러 개의 선 그래프는 지금도 보기에 복잡할 수 있으므로

 

텍스트에 테두리 상자를 넣지는 않겠습니다.

 

마지막으로 4개의 선이니 각각 for문을 써줬는데

 

더 많은 선을 그려야 할 땐 번거롭겠죠?

 

마지막으로 이중 for문을 통해 한번에 그리는 법을 살펴보겠습니다.

 

 

이중 for문으로 한 번에 텍스트 삽입

science = [physics, chemistry, life, earth]

plt.figure(figsize = (10, 5))
plt.title('수능 과학탐구 응시자 수')
plt.xlabel('학년도')
plt.ylabel('응시자 수(단위 : 만명)')
plt.plot(year, physics, marker = 'o', ms = 10, ls = '-', label = '물리학')
plt.plot(year, chemistry, marker = 'd', ms = 10, ls = '-.', label = '화학')
plt.plot(year, life, marker = 'v', ms = 10, ls = '--', label = '생명과학')
plt.plot(year, earth, marker = 'x', ms = 10, ls = ':', label = '지구과학')
for k in range(len(science)) :
    for i, j in enumerate(science[k]) :
        plt.text(year[i], science[k][i] + 0.5, j, ha = 'center', color = 'purple')
plt.legend(ncol = 4, loc = (0.3, 0.9))
plt.show()

이렇게 science라는 리스트를 만들고

 

안에 physics, chemistry, life, earth를 넣습니다.

 

그리고 for문에 len함수를 써서

 

science의 길이만큼 돌아가게 만들고

 

각각의 과목이 들어갈 자리에 science[k]로 인덱싱을 해주고 나면

 

그 뒤에는 한 개의 선 그래프에 텍스트를 삽입할 때랑 똑같이 해주시면 끝입니다.

 

다음에는 matplotlib을 통해 산점도를 그려볼게요!