이번 포스팅에서는 openpyxl을 이용하여 엑셀(Excel)에 Scatter Chart(산점도)와 Bubble Chart (버블 차트)를 그려서 삽입하는 방법을 알아보고자 한다.
Scatter Chart, Bubble Chart
- 목차 -
1) Scatter Chart
먼저 Scatter Chart(산점도) 그려보는 방법을 알아보자. openpyxl에서는 ScatterChart 클래스를 이용하여 산점도를 그릴 수 있다. 아래 코드는 샘플 데이터를 생성하고 ScatterChart를 이용하여 산점도를 그려서 엑셀 파일로 저장한다.
from openpyxl import Workbook
from openpyxl.chart import ScatterChart, Reference, Series
from openpyxl.chart.axis import ChartLines
wb = Workbook()
ws = wb.active
## 데이터 생성
rows = [
['Size', 'Batch 1', 'Batch 2'],
[2, 40, 30],
[3, 40, 25],
[4, 50, 30],
[5, 30, 25],
[6, 25, 35],
[7, 20, 40],
]
## 데이터 삽입
for row in rows:
ws.append(row)
chart = ScatterChart()
chart.title = "Scatter Chart" ## 차트 타이틀
chart.x_axis.title = 'Size' ## x축 라벨
chart.y_axis.title = 'Percentage' ## y축 라벨
chart.x_axis.majorGridlines = None ## x grideline 제거
chart.y_axis.majorGridlines = None ## y grideline 제거
## x 데이터
xvalues = Reference(ws, min_col=1, min_row=2, max_row=7)
marker_face_color = ["AA49FF", "FF0000"]
marker_border_color = ["00FF00", "00AAFF"]
marker_size = [10, 15]
for i in range(2, 4):
yvalues = Reference(ws, min_col=i, min_row=1, max_row=7) ## y 데이터 생성
series = Series(yvalues, xvalues, title_from_data=True) ## x, y 데이터를 갖는 시리즈 생성
series.marker.symbol = 'circle' ## {'picture', 'star', 'diamond', 'square', 'x', 'triangle', 'plus', 'circle', 'dash', 'auto', 'dot'}
series.marker.graphicalProperties.solidFill = marker_face_color[i-2] # 마커 영역 색상
series.marker.graphicalProperties.line.solidFill = marker_border_color[i-2] # 마커 테두리 색상
series.marker.size=marker_size[i-2] ## 마커 크기
series.graphicalProperties.line.noFill = True ## 라인 제거
chart.series.append(series) ## series 등록
ws.add_chart(chart, "A10") ## 차트 등록
wb.save("scatter.xlsx")
line 23~28
먼저 ScatterChart 클래스를 생성한다. 그리고 차트 타이틀, x, y축 라벨을 지정하고 gridline을 제거한다.
line 31~45
x 데이터를 Reference 클래스를 통해 설정한다. 그리고 for 문을 돌면서 각 y 데이터를 Reference 클래스를 통해 설정한다. 다음으로 x, y 데이터를 포함하는 Series 객체(클래스)를 정의한다. 그리고 Series 객체의 marker 필드를 통해 여러 가지 옵션을 정할 수 있다. 여기서는 마커 모양, 마커 배경색, 마커 테두리 색, 마커 사이즈를 설정했다. 추가적으로 라인을 그리지 않도록(산점도니까) 해주었다. 그런 다음 series를 ScatterChart 객체에 추가해준다. 그리고 나서 차트를 등록해주면 끝~!!
위 코드를 실행하면 아래와 같이 엑셀 파일 안에 산점도가 잘 추가된 것을 알 수 있다.
2) Bubble Chart
openpyxl에서는 BubbleChart를 이용하여 버블 차트를 그릴 수 있다. 그리는 방식은 앞에서 살펴본 산점도와 흡사하다.
from openpyxl import Workbook
from openpyxl.chart import Series, Reference, BubbleChart
wb = Workbook()
ws = wb.active
## 데이터 생성
rows = [
("Number of Products", "Sales in USD", "Market share"),
(14, 12200, 15),
(20, 60000, 33),
(18, 24400, 10),
(22, 32000, 42),
(),
(12, 8200, 18),
(15, 50000, 30),
(19, 22400, 15),
(25, 25000, 50),
]
## 데이터 시트에 삽입
for row in rows:
ws.append(row)
chart = BubbleChart()
chart.auto_axis=False ## 자동으로 축 범위 생성 안함.
chart.y_axis.scaling.min = 0 ## y 축 최소값
chart.y_axis.scaling.max = 70000 ## y 축 최대값
# x, y 데이터 설정
xvalues = Reference(ws, min_col=1, min_row=2, max_row=5)
yvalues = Reference(ws, min_col=2, min_row=2, max_row=5)
# 마커 사이즈로 표현할 데이터 설정
size = Reference(ws, min_col=3, min_row=2, max_row=5)
## Series 객체 생성
series = Series(values=yvalues, xvalues=xvalues, zvalues=size, title="2013")
chart.series.append(series) ## 차트에 Series 객체 추가
# 두 번째 x, y 데이터 설정 및 Series 객체 추가
xvalues = Reference(ws, min_col=1, min_row=7, max_row=10)
yvalues = Reference(ws, min_col=2, min_row=7, max_row=10)
size = Reference(ws, min_col=3, min_row=7, max_row=10)
series = Series(values=yvalues, xvalues=xvalues, zvalues=size, title="2014")
chart.series.append(series)
ws.add_chart(chart, "E1") ## E1에 삽입
wb.save("bubble.xlsx")
line 26~28
왜 그런지 모르겠는데 y축 범위를 따로 설정하지 않으면 이상하게 나온다. 따라서 축 범위를 지정했다.
line 35
버블 차트는 제 3의 데이터를 마커 사이즈로 표현하므로 이에 대한 참조 데이터를 추가적으로 정의해야 한다.
line 38~39
Series 객체를 생성한다. 이때 zvalue 인자에 마커 사이즈로 표현할 데이터를 넘겨준다. 이때 title을 통하여 범례 라벨도 정해주었다. 그런 다음 BubbleChart 객체에 앞에서 정의한 Series를 추가한다.
위 코드를 실행하면 아래와 같이 엑셀 파일 안에 버블 차트가 잘 추가된 것을 알 수 있다.
- 참고 자료 -
openpyxl 문서 - https://openpyxl.readthedocs.io/en/stable/charts/introduction.html
'프로그래밍 > 엑셀(Excel)' 카테고리의 다른 글
[OpenPyXL] 차트 그리기 - (5) Radar Chart (0) | 2022.10.29 |
---|---|
[OpenPyXL] 차트 그리기 - (4) Pie Chart, Doughnut Chart (0) | 2022.10.29 |
[OpenPyXL] 차트 그리기 - (2) Bar Chart (0) | 2022.10.29 |
[OpenPyXL] 차트 그리기 - (1) Line Chart (0) | 2022.10.27 |
[OpenPyXL] 9. 데이터를 다 포함하도록 셀 폭 조절하기 (0) | 2022.10.06 |
댓글