본문 바로가기
프로그래밍/엑셀(Excel)

[OpenPyXL] 차트 그리기 - (1) Line Chart

by 부자 꽁냥이 2022. 10. 27.

이번 포스팅에서는 openpyxl을 이용하여 Line Chart 그리는 방법을 알아보고자 한다.


   Line Chart

- 목차 -

1. 2d Line Chart

2. 3d Line Chart

3. Style(1~48)

1. 2d Line Chart

2d Line Chart는 특정 범위의 데이터를 2차원 선 그래프로 시각화한 것이다. openpyxl에서는 LineChart를 이용하여 2d Line Chart를 그릴 수 있다. 아래 코드는 Line Chart를 그려본 것이다.

 

코드 설명은 Line Chart와 관련된 부분을 중점적으로 하며 설명하지 않는 부분은 주석을 참고하면 된다.

 

from datetime import date

from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.axis import DateAxis
from openpyxl.chart.shapes import GraphicalProperties

wb = Workbook()
ws = wb.active

rows = [
    ['Date', 'Batch 1', 'Batch 2', 'Batch 3'],
    [date(2015,9, 1), 40, 30, 25],
    [date(2015,9, 2), 40, 25, 30],
    [date(2015,9, 3), 50, 30, 45],
    [date(2015,9, 4), 30, 25, 40],
    [date(2015,9, 5), 25, 35, 30],
    [date(2015,9, 6), 20, 40, 35],
]

for row in rows:
    ws.append(row)

c1 = LineChart()
c1.title = "Line Chart" ## 차트 타이틀
c1.style = 13 # 1~48 차트 스타일
c1.width = 10 ## 차트 폭
c1.height = 9 ## 차트 높이
c1.y_axis.title = 'Size' # y축 라벨
c1.y_axis.crossAx = 500 ## y축 교차축

## 날짜 축 설정
c1.x_axis = DateAxis(crossAx=100) ## x축을 날짜 축으로 설정
c1.x_axis.title = "Date" # x축 라벨
c1.x_axis.number_format = 'd-mmm' ## 일 - 월 세글자만
c1.x_axis.majorTimeUnit = "days" ## 눈금 단위 {'months', 'years', 'days'}

## 그림 영역 배경색 설정 
props = GraphicalProperties(solidFill="999999") 
c1.plot_area.graphicalProperties = props 

## 시각화 대상 데이터
data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7)
c1.add_data(data, titles_from_data=True) ## titles_from_data=True : 범례 라벨을 칼럼으로 설정

# Style the lines
s1 = c1.series[0]
s1.marker.symbol = "triangle" ## 마커 모양
s1.marker.graphicalProperties.solidFill = "FF0000" # 마커 영역 색상
s1.marker.graphicalProperties.line.solidFill = "FF0000" # 마커 테두리 색상

s1.graphicalProperties.line.noFill = True ## 라인 제거

s2 = c1.series[1]
s2.graphicalProperties.line.solidFill = "00AAAA"
s2.graphicalProperties.line.dashStyle = "sysDot"

s3 = c1.series[2]
s3.smooth = True ## 라인을 매끄럽게 만듬.
s3.graphicalProperties.line.width = 100000 # width in EMUs

ws.add_chart(c1, "A10")
wb.save("line_01.xlsx")

 

line 24~36

먼저 LineChart 클래스를 생성하고 차트에 대한 전반적인 설정(타이틀, 차트 폭과 높이 등)을 수행한다. 이때 style 필드를 통해 사전에 정해진 차트 스타일(차트 배경, 라인 색상, 라인 두께)을 적용할 수 있다. 1~48까지의 정수를 입력해야 하며 각 스타일 예시는 아래에서 확인할 수 있다.

 

line 39~40

그림 영역의 배경색을 지정한다. 이때 GraphicalProperties 클래스를 이용하여 인자값을 설정한 뒤 plot_area.graphicalProperties 필드에 해당 클래스를 할당하면 된다. 참고로 차트 배경(그림 영역 바깥쪽) 색을 설정하는 방법은 아무리 뒤져도 찾을 수 없었다. 알고 계신 분들은 알려주면 좋겠다. 

 

line 43~44

시각화할 데이터를 지정해야한다. 이때 Reference 클래스를 이용하여 데이터 범위를 지정하고 add_data 메서드를 통해 해당 데이터를 등록한다.

 

line 47~60

데이터를 등록하면 데이터 칼럼 개수만큼 series가 생성되는데 각 series는 하나의 라인을 그리게 된다. 이때 각 series에 접근하여 라인 속성을 바꿀 수 있다.

 

line 62

아직 끝나지 않았다. 지금까지 설정한 차트를 add_chart 메서드를 통해 등록해줘야 한다. 이때 첫 번째 인자는 LineChart 클래스, 두 번째 인자는 차트 좌상단 셀 주소를 전달한다.

 

위 코드를 실행하면 아래와 같이 Line Chart가 잘 그려진 것을 알 수 있다.

 


2. 3d Line Chart

이번엔 3d Line Chart를 그려보자. openpyxl에서는 LineChart3D을 이용하여 그릴 수 있다. 아래 코드를 통해 그 사용법을 알 수 있다. 원리는 2d Line Chart와 동일하므로 설명은 생략한다.

 

from openpyxl.chart import LineChart3D

wb = Workbook()
ws = wb.active

for row in rows:
    ws.append(row)

    
c1 = LineChart3D()
c1.title = "3D Line Chart"  ## 차트 타이틀
c1.legend = None
c1.style = 15 # 1~48 차트 스타일
c1.y_axis.title = 'Size' # y축 라벨
c1.x_axis.title = 'Test Number' # x축 라벨

## 시각화 데이터 범위 지정 및 등록
data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7)
c1.add_data(data, titles_from_data=True)

ws.add_chart(c1, "A10") ## 차트 등록
wb.save("line_01_3D.xlsx")

 


3. Style(1~48)

앞에서 말했듯이 style은 1~48까지의 정수를 입력할 수 있으며 각 숫자마다 차트 배경색, 라인 두께, 라인 색상 등 사전에 설정된 차트 스타일을 적용할 수 있다. 아래 그림을 통해 각 숫자가 어떤 스타일인지 확인해볼 수 있으므로 각자 취향에 맞는 스타일을 선택하면 된다.

 

openpyxl chart style 1~9

 

openpyxl chart style 10~18
openpyxl chart style 19~27
openpyxl chart style 28~36
openpyxl chart style 37~45
openpyxl chart style 46~48


- 참고 자료 -

Line Charts - https://openpyxl.readthedocs.io/en/stable/charts/line.html#line-charts


댓글


맨 위로