250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Folium
- 오류
- matplotlib
- 코로나
- kepler.gl
- 라이엇api
- 공공데이터포털
- 시각화
- covid19
- geopandas에러
- 파이썬
- 라이엇
- 막대그래프
- r
- map
- geopandas설치
- Python
- 지도
- 인코등
- 오픈API
- API
- QGIS라벨링
- covid
- riotapi
- geopnadas
- 마커클러스터
- OSMnx
- pipwin
- kepler
- 에러
Archives
- Today
- Total
Nerdy
[Matplotlib] 천단위 콤마(,) 표시와 그래프 레이블 값 표시하기 본문
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
'Python > [Matplotlib]' 카테고리의 다른 글
[Matplotlib] 코로나 사망자 주간 발생 추이 막대 그래프 그리기 (0) | 2022.06.24 |
---|---|
[Matplotlib] 젤렌스키 대통령 연설문 Wordcloud 만들기 - 2 (0) | 2022.06.20 |
[Matplotlib] 젤렌스키 대통령 연설문 Wordcloud 만들기 - 1 (0) | 2022.06.20 |
[Matplotlib] 산점도 그래프(Scatter plot) 그리기 (0) | 2022.06.20 |
[Matplotlib] 파이 차트 그리기 (0) | 2022.06.19 |