나는 엑셀 대신 파이썬을 사용한다. 차트 그리기 편
파이썬으로 엑셀에서 차트를 그리는 방법에 대해서 알아봅시다.
지난 포스팅에서 단지 몇 줄의 코드만으로 엑셀의 대표 기능인 필터 기능, 정렬 기능, VLOOKUP 기능, 피벗테이블 기능을 구현하여 보았습니다.
엑셀에서 데이터를 가시화를 하기 위해, 대부분의 사람들이 차트를 많이 사용하는데, 파이썬의 Matplotlib 라이브러리를 이용하여 쉽게 차트를 그리는 방법도 있지만, 오늘은 엑셀의 데이터를 차트로 그려서 엑셀에 삽입하는 방법에 대해서 구체적으로 살펴보겠습니다.
파이썬으로 엑셀을 다루기 위해서는 관련 라이브러리를 설치해야 됩니다. 엑셀 관련 유명한 라이브러리에는 xlwt, xlsxwriter, openpyxl, xlrd 등이 있는데, 가장 많이 사용되고 있고 문서화가 잘되어 있는 openpyxl이라는 라이브러리를 사용합니다.
먼저 openpyxl 라이브러리를 import 해봅시다.
만약 아래와 같이 ModuleNotFoundError: No module named 'openpyxl' 이 발생한다면 pip install openpyxl이라고 실행하여 openpyxl 라이브러리를 컴퓨터에 설치하면 됩니다.
주피터 노트북에서 명령 프롬프트를 실행 방법은 코드 셀에 '!'를 먼저 입력하고 뒤에 pip install openpyxl 입력 후 실행하면 됩니다.
openpyxl-3.0.4 버전에 성공적으로 설치되었습니다.
본격적인 설명에 앞서 간단한 용어 정리 몇 가지만 하고 시작합시다.
workbook(wb)은 엑셀 파일, worksheet(ws)는 엑셀 sheet, row는 1, 2, 3으로 시작하는 엑셀의 행, column은 A, B, C로 시작하는 엑셀의 열, cell은 실제로 값을 입력할 수 있는 곳입니다.
아래 유첨 파일은 오늘 포스팅에 사용할 엑셀 파일입니다.
openpyxl를 import 하고 위의 다운로드한 파일을 파이썬 코드가 있는 폴더에 저장하였다면 엑셀 파일을 읽어서 workbook(wb)를 신규로 생성합니다.
wb를 신규 생성하기 위해서 openpyxl.load_workbook()라는 함수를 사용합니다. 함수 인자에는 읽고자 하는 엑셀 파일 이름을 입력합니다.
다음은 읽어온 wb(workbook)에서 worksheet(ws)를 불러와야 됩니다.
wb ['사용하고 있는 sheet 이름']의 형태로 사용하고 이렇게 가져온 worksheet를 ws에 저장하였습니다.
wb = openpyxl.load_workbook('시가총액 Top 15.xlsx')
ws = wb['Sheet1']
참고로 wb(workbook)에 어떤 sheet들이 실제 사용되었는지 알기 위한 방법은 wb.sheetnames라고 실행하면 wb에서 사용되고 있는 전체 sheet의 이름들이 리스트 형태로 반환되고 출력하면 확인이 가능합니다.
오늘 사용할 차트는 꺾은선형 차트이기 때문에 chart.LineChart()를 객체로 불러와서 chart라고 저장하면 됩니다.
chart = openpyxl.chart.LineChart()
차트 사용에 있어 중요한 두 가지 영역이 있습니다. 이 두 가지 영역을 정확하게 지정해주어야 합니다.
차트로 실제로 표현하기 위한 data 영역과 차트의 가로축으로 사용할 category 영역입니다.
먼저 chart.Reference()를 사용하여 data 영역 지정합니다.
min_col과 min_row는 data 영역의 좌상의 cell(아래 그림에서 현대차가 적혀 있는 cell)의 column 인덱스 '1'과 row 인덱스 '2'를 각각 입력합니다.
max_col과 max_row는 data 영역의 우하의 cell(아래 드림의 0.944가 적혀 있는 cell)의 column 인덱스 '21'과 row 인덱스 '16'를 각각 입력합니다.
data 영역의 지정이 완료되었으면 add_data() 함수를 이용하여 차트에 추가합니다.
위에서 지정한 영역이 저장된 변수(datas)를 첫 번째 인수로 입력하고 from_rows는 데이터들이 행으로 작성되어 있으면 True, 열의 형태로 작성되어 있으면 False를 선택합니다. 마지막에 있는 titles_from_data는 위에서 지정한 데이터 영역 각각에 현대차, 카카오 등과 같이 데이터의 타이틀이 포함되어 있다면 True를, 반대의 경우에는 False를 선택하면 됩니다.
datas = openpyxl.chart.Reference(ws, min_col=1, min_row=2, max_col=21, max_row=16)
chart.add_data(datas, from_rows=True, titles_from_data=True)
다음은 카테고리(category) 영역의 지정입니다. 방식은 data 영역 지정과 동일하며 차트에서 가로축으로 표현하고자 하는 영역을 지정하면 됩니다. set_categories() 함수를 이용하여 차트에 설정하면 됩니다.
cats = openpyxl.chart.Reference(ws, min_col=2, min_row=1, max_col=21, max_row=1)
chart.set_categories(cats)
마지막 단계로 작성한 차트를 엑셀의 원하는 worksheet, 원하는 cell에 추가하기입니다.
지금은 이미 생성한 ws(worksheet)에 "B2" cell에 추가하였습니다.
지금까지 작업한 결과를 다른 이름으로 저장하기는 wb.save("파일 이름. xlsx")로 파일 다른 이름으로 저장이 가능합니다.
ws.add_chart(chart, "B2")
wb.save('차트 추가하기 결과.xlsx')
엑셀을 열어서 확인해보면 다음과 같이 꺾은선형 차트가 cell "B2"에 그려져 있는 것을 확인할 수 있습니다.
추가적으로 차트 제목, 가로축 제목, 세로축 제목 등을 추가하고 가로축의 범위를 조정하여 최종 완료해보았습니다.
아래 파이썬 코드는 전체 코드 내용이니 참조하면 됩니다.
import openpyxl
wb = openpyxl.load_workbook('시가총액 Top 15.xlsx')
ws = wb['Sheet1']
chart = openpyxl.chart.LineChart()
chart.title = "주가 일별 등락 페턴"
chart.x_axis.title = '날짜'
chart.y_axis.title = '종목별 추이'
chart.y_axis.scaling.min = 0.8
chart.y_axis.scaling.max = 1.4
datas = openpyxl.chart.Reference(ws, min_col=1, min_row=2, max_col=21, max_row=16)
chart.add_data(datas, from_rows=True, titles_from_data=True)
cats = openpyxl.chart.Reference(ws, min_col=2, min_row=1, max_col=21, max_row=1)
chart.set_categories(cats)
ws.add_chart(chart, "B2")
wb.save('차트 추가하기 결과.xlsx')
wb.close()
여기까지 파이썬으로 엑셀의 차트 그리기를 알아보았습니다.
파이썬으로 openpyxl라이브러리를 사용할 때 알고 있으면 도움이 되는 팀 몇 가지 추가합니다.
worksheet(ws)에서 마지막 행 번호 가져오기 : ws.max_row
worksheet(ws)에서 마지막 열 번호 가져오기 : ws.max_column
열의 이름을 인덱스로 반환받는 함수 : column_index_from_string()
열의 인덱스를 열 이름으로 반환받는 함수 : get_column_letter()
해당 함수는 openpyxl 라이브러리에서 utils라는 package에 정의되어 있기 때문에 아래와 같이 import 이후 사용하면 됩니다.
오늘 정리한 내용 중에 궁금한 점 있으면 댓글 주세요.
'파이썬 기초' 카테고리의 다른 글
파이썬 언어의 특징 (0) | 2020.08.13 |
---|---|
파이썬의 역사 알고 파이썬 시작하자 (0) | 2020.08.11 |
[파이썬 활용] 주식 등락률 비교해보기 (0) | 2020.07.21 |
나는 엑셀 대신 파이썬을 사용한다. 피벗테이블편 (0) | 2020.07.18 |
나는 엑셀 대신 파이썬을 사용한다. (4) | 2020.07.15 |