이번 포스팅에서는 openpyxl을 이용하여 파이 차트(Pie Chart)와 도넛 차트(Doughnut Chart)를 그려보고 엑셀에 삽입하는 방법을 알아본다.
Pie Chart, Doughnut Chart
- 목차 -
1. Pie Chart
openpyxl에서는 파이 차트를 그리기 위해 PieChart 클래스를 제공한다. 아래는 PieChart 클래스를 이용하여 파이 차트를 정의하고 이를 엑셀 파일에 삽입한다.
from openpyxl import Workbook
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.series import DataPoint
wb = Workbook()
ws = wb.active
## 데이터 생성
data = [
['Pie', 'Sold'],
['Apple', 50],
['Cherry', 30],
['Pumpkin', 10],
['Chocolate', 40],
]
## 데이터 삽입
for row in data:
ws.append(row)
pie = PieChart()
pie.style = 45 ## 차트 스타일 1~48
labels = Reference(ws, min_col=1, min_row=2, max_row=5) ## 범주형 참조 데이터
data = Reference(ws, min_col=2, min_row=1, max_row=5) ## 연속형 참조 데이터
pie.add_data(data, titles_from_data=True) ## 연속형 데이터 등록
pie.set_categories(labels) ## 범주형 데이터 설정
pie.title = "Pies sold by category" ## 차트 타이틀
## 12시 방향을 기준으로 시계방향으로 파이 조각 인덱스 부여
## 파이 조각이 4개가 있으므로 idx는 0~3까지 선택 가능
slice = DataPoint(idx=0, explosion=20) ## explosion 조각이 떨어지는 정도.
pie.series[0].data_points = [slice]
ws.add_chart(pie, "D1") ## 차트 등록
wb.save("pie.xlsx")
line 22
파이 차트 스타일을 1~48 사이에 있는 정수로 지정할 수 있다. 각 정수가 어떤 스타일인지는 아래에서 확인할 수 있다.
line 31~32
여기서는 특정 파이 조각을 자르기 위하여 DataPoint 클래스를 이용한다. idx는 현재 범주가 4개 이므로 0~3까지 지정할 수 있다. 이 idx는 잘려나가는 파이 조각을 의미한다. idx는 0부터 시작하며 12시 방향에서 시계 방향의 조각을 의미한다. 그런 다음 리스트로 감싸서 Series 객체의 data_points 필드에 할당한다.
위 코드를 실행하면 다음과 같이 파이 차트가 잘 삽입된 것을 알 수 있다.
2. Projected Pie Chart
Projected Pie Chart는 파이 크기가 작아서 제대로 안보이는 부분을 크게 확대해서 보여줄 수 있는 차트이다. openpyxl에서는 ProjectedPieChart 클래스를 이용하여 Projected Pie Chart를 그릴 수 있다.
from openpyxl.chart import ProjectedPieChart
wb = Workbook()
ws = wb.active
## 데이터 생성
data = [
['Page', 'Views'],
['Search', 95],
['Products', 4],
['Offers', 0.5],
['Sales', 0.5],
]
## 시트에 데이터 삽입
for row in data:
ws.append(row)
## Projected Pie Chart
projected_pie = ProjectedPieChart()
projected_pie.type = "pie" ## 영역이 좁은 부분을 파이 차트로 확대
projected_pie.splitType = "val" # 값에 따라 확대 영역 결정?
labels = Reference(ws, min_col=1, min_row=2, max_row=5) ## 범주형 참조 데이터
data = Reference(ws, min_col=2, min_row=1, max_row=5) ## 연속형 참조 데이터
## 연속형, 범주형 데이터 등록
projected_pie.add_data(data, titles_from_data=True)
projected_pie.set_categories(labels)
ws.add_chart(projected_pie, "A10") ## 차트 등록
from copy import deepcopy
projected_bar = deepcopy(projected_pie)
projected_bar.type = "bar" ## 영역이 좁은 부분을 스택 바 차트로 확대
projected_bar.splitType = 'pos' # 위치 따라 확대 영역 결정?
ws.add_chart(projected_bar, "A27")
wb.save("projected_pie.xlsx")
line 21~22
확대하는 부분을 파이 차트로 표현하기 위해 ProjectedPieChart 클래스의 type 필드에 'pie'를 할당한다. 참고로 'bar'는 확대하는 부분을 바 차트로 표현한다. 다음으로 splitType에 확대할 영역을 어떤 기준으로 할 것인가를 정해야 하는데 'val'은 특정 비율 이하일 때 그리고 'pos'는 특정 영역을 기준으로 확대할 영역 정하는 것 같다(이 부분은 검색을 해도 잘 안 나와서 확실치는 않다).
2. 3d Pie Chart
openpyxl에서는 3d Pie Chart를 그리기 위해 PieChart3D 클래스를 제공한다. 아래 코드는 PieChart3D 클래스를 이용하여 3d Pie Chart를 정의하고 엑셀에 삽입한다.
from openpyxl.chart import PieChart3D
## 데이터 생성
data = [
['Pie', 'Sold'],
['Apple', 50],
['Cherry', 30],
['Pumpkin', 10],
['Chocolate', 40],
]
wb = Workbook()
ws = wb.active
## 시트에 데이터 삽입
for row in data:
ws.append(row)
pie = PieChart3D()
pie.title = "3D Pie Chart" ## 차트 타이틀
labels = Reference(ws, min_col=1, min_row=2, max_row=5) ## 범주형 참조 데이터
data = Reference(ws, min_col=2, min_row=1, max_row=5) ## 연속형 참조 데이터
## 연속형, 범주형 데이터 등록
pie.add_data(data, titles_from_data=True)
pie.set_categories(labels)
ws.add_chart(pie, "D1") ## D1에 차트 삽입
wb.save("pie3D.xlsx")
4. Doughnut Chart
openpyxl에서는 도넛 차트를 그리기 위한 DoughnutChart 클래스를 제공한다. 아래 코드는 DoughnutChart을 이용하여 도넛 차트를 그린 다음 엑셀에 삽입한다.
from openpyxl.chart import DoughnutChart, Series
wb = Workbook()
ws = wb.active
## 데이터 생성
data = [
['Pie', 2014, 2015],
['Plain', 40, 50],
['Jam', 2, 10],
['Lime', 20, 30],
['Chocolate', 30, 40],
]
## 시트에 데이터 삽입
for row in data:
ws.append(row)
chart = DoughnutChart()
labels = Reference(ws, min_col=1, min_row=2, max_row=5) ## 범주형 참조 데이터
data = Reference(ws, min_col=2, min_row=1, max_row=5) ## 연속형 참조 데이터
chart.title = "Doughnuts sold by category"
chart.style = 26 ## 차트 스타일
chart.holeSize = 40 ## 중앙 홀 사이즈
## 연속형, 범주형 데이터 등록
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)
slices = [DataPoint(idx=i) for i in range(4)]
plain, jam, lime, chocolate = slices
chart.series[0].data_points = slices
## 파이 조각 색상 설정
plain.graphicalProperties.solidFill = "FAE1D0"
jam.graphicalProperties.solidFill = "BB2244"
lime.graphicalProperties.solidFill = "22DD22"
chocolate.graphicalProperties.solidFill = "61210B"
chocolate.explosion = 10 ## 초콜렛 파이 떨어지는 정도
ws.add_chart(chart, "E1") ## E1에 도넛 차트 추가
from copy import deepcopy
chart2 = deepcopy(chart)
chart2.title = None
data = Reference(ws, min_col=3, min_row=1, max_row=5)
## 바깥쪽 도넛 추가
series2 = Series(data, title_from_data=True)
series2.data_points = slices
chart2.series.append(series2)
ws.add_chart(chart2, "E17") ## E17에 도넛 차트 추갸
wb.save("doughnut.xlsx")
line 49~51
Series 객체에 데이터를 담아 추가하면 바깥쪽 방향으로 도넛 차트가 추가된다.
5. Style
openpyxl 에서는 48개의 사전에 정의된 파이 차트 스타일이 있다. 아래 그림을 통해 어떤 스타일이 있는지 확인해보고 각자 취향에 맞는 스타일을 선택하면 된다.
- 참고 자료 -
Pie Charts - https://openpyxl.readthedocs.io/en/stable/charts/pie.html
Doughnut Charts - https://openpyxl.readthedocs.io/en/stable/charts/doughnut.html
'프로그래밍 > 엑셀(Excel)' 카테고리의 다른 글
[OpenPyXL] 차트 그리기 - (6) Area Chart (0) | 2022.10.29 |
---|---|
[OpenPyXL] 차트 그리기 - (5) Radar Chart (0) | 2022.10.29 |
[OpenPyXL] 차트 그리기 - (3) Scatter Chart, Bubble Chart (0) | 2022.10.29 |
[OpenPyXL] 차트 그리기 - (2) Bar Chart (0) | 2022.10.29 |
[OpenPyXL] 차트 그리기 - (1) Line Chart (0) | 2022.10.27 |
댓글