Nerdy

[Matplotlib] 천단위 콤마(,) 표시와 그래프 레이블 값 표시하기 본문

Python/[Matplotlib]

[Matplotlib] 천단위 콤마(,) 표시와 그래프 레이블 값 표시하기

뚱인데요? 2022. 6. 25. 11:00
728x90

코로나 데이터에 일일 누적 확진자 수와 일자별 국내발생 수 데이터가 있다.

단순히 데이터들을 변수에 담아 막대그래프를 그리면 간단히 될 줄 알았지만 데이터가 천만이 넘는 숫자형 데이터가 보니 축에 표시가 되지 않는 현상이 발생한다.

 

이번 포스팅에서는 축 범위에 만단위 숫자 설정과 막대 그래프에 레이블값 표시한 방법을 리뷰해볼려고 한다.

 

데이터 파일을 가져오고 전처리와 정수형 변환은 이전 포스팅 내용과 동일하다.

# 사용할 라이브러리 import
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager, rc
import warnings

# 데이터프레임 출력
df = pd.read_csv('corona19.csv', encoding = 'UTF-8')
df
# 사용할 컬럼만 추출
df_sample = df.loc[:, ['일자', '계(명)', '국내발생(명)', '해외유입(명)']]
df_sample = df_sample.drop(0, axis = 0)

df_sample.head()

# 데이터 전처리
df_sample['계(명)'] = df_sample['계(명)'].str.replace(',', repl = '')

df_sample['국내발생(명)'] = df_sample['국내발생(명)'].str.replace(',', repl = '')
df_sample['국내발생(명)'] = df_sample['국내발생(명)'].replace('-', 0)

df_sample['해외유입(명)'] = df_sample['해외유입(명)'].str.replace(',', repl = '')
df_sample['해외유입(명)'] = df_sample['해외유입(명)'].replace('-', 0)

df_sample.head()

# 정수형 변환
df_sample['계(명)'] = df_sample['계(명)'].astype(int)
df_sample['국내발생(명)'] = df_sample['국내발생(명)'].astype(int)
df_sample['해외유입(명)'] = df_sample['해외유입(명)'].astype(int)

# 일자 컬럼 자료형으로 변환
df_sample['일자'] = pd.to_datetime(df_sample['일자'])
df_sample.dtypes

 

 

2022년 6월 18일부터 22일까지의 누적합산 데이터만 추출한다.

# 6월 18일 누적
a1 = df_sample[df_sample['일자'] <= '2022-06-18']
a1_value = a1['계(명)'].sum() # 18270437

# 6월 19일 누적
b1 = df_sample[df_sample['일자'] <= '2022-06-19']
b1_value = b1['계(명)'].sum() # 18276505

# 6월 20일 누적
c1 = df_sample[df_sample['일자'] <= '2022-06-20']
c1_value = c1['계(명)'].sum() # 18280039

# 6월 21일 누적
d1 = df_sample[df_sample['일자'] <= '2022-06-21']
d1_value = d1['계(명)'].sum() # 18289349

# 6월 22일 누적
f1 = df_sample[df_sample['일자'] <= '2022-06-22']
f1_value = f1['계(명)'].sum() # 18298341

 

한글깨짐 방지를 위해 font path를 미리 설정해주고 그래프에 표시할 변수들을 각각 객체에 담는다.

font_path = "C:/Windows/Fonts/malgun.ttf"
font = font_manager.FontProperties(fname = font_path).get_name()
rc('font', family = font)

x = np.arange(5)
year = ['6월 18일', '06월 19일', '06월 20일', '06월 21일', '06월 22일'] # x축 표시
value = [a1_value, b1_value, c1_value, d1_value, f1_value]

 

그래프에 값을 표시하기 위해 plt.txt를 사용하면 된다.

x축과 y축 좌표에 값을 표시하는 텍스트이며 x축은 v, y축은 y[0]..y[1]이며 y[0]..y[1]를 표시한다.

리스트의 순서와 값을 전달하는 기능을 가진 enumerate를 함수를 사용한다.

for i, v in enumerate(x):
    plt.text(v, value[i], value[i],
             fontsize = 11,
             fontweight = 'bold',
             color = 'royalblue',
             horizontalalignment='center',
             verticalalignment='bottom')

 

y축 눈금에 숫자 천단위 콤마(,)를 찍기 위해 데이터를 생성한다

n = 20
data=np.random.normal(loc=0,size=n, scale=500000) + 1000000

 

plt.gca().get_yticks를 이용하여 눈금의 정보를 가져온 뒤 문자 format 함수를 이용해 천단위로 콤마를 찍는 형식을 구성해준다.

이 결과를 set_yticklabels에 넘겨주면 y축에 천단위 콤마가 찍혀져 표현이 된다.

current_values = plt.gca().get_yticks()
ax.set_yticklabels(['{:,.0f}'.format(x) for x in current_values])

 

matplotlib 전체 코드와 결과는 다음과 같다.

 

■ 전체 코드

# 한글깨짐 방지 설정
font_path = "C:/Windows/Fonts/malgun.ttf"
font = font_manager.FontProperties(fname = font_path).get_name()
rc('font', family = font)

x = np.arange(5)
year = ['6월 18일', '06월 19일', '06월 20일', '06월 21일', '06월 22일'] # x축 표시
value = [a1_value, b1_value, c1_value, d1_value, f1_value]

n = 20
data=np.random.normal(loc=0,size=n, scale=500000) + 1000000

plt.figure(figsize=(12, 8))
ax = plt.gca()
plt.bar(x, value, width = 0.4, color = 'royalblue') # width : 막대 폭 지정
for i, v in enumerate(x):
    plt.text(v, value[i], value[i],
             fontsize = 11,
             fontweight = 'bold',
             color = 'royalblue',
             horizontalalignment='center',
             verticalalignment='bottom')

plt.xticks(x, year, fontsize = 13)
plt.grid(True, axis = 'y', alpha = 0.1)
current_values = plt.gca().get_yticks()
ax.set_yticklabels(['{:,.0f}'.format(x) for x in current_values])
ax.tick_params(bottom = False) # x축 눈금 숨기기
ax.tick_params(axis = 'y', color = 'whitesmoke')
ax.spines['right'].set_color('white')
ax.spines['top'].set_color('whitesmoke')
ax.spines['bottom'].set_color('whitesmoke')
ax.spines['left'].set_color('whitesmoke')
plt.title('누적 확진환자', loc = 'left', fontsize = 20, fontweight = 'bold')
plt.show()

 

■ 결과

728x90