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

[OpenPyXL] 차트 그리기 - (2) Bar Chart

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

이번 포스팅에서는 openpyxl을 이용하여 바 차트(Bar Chart, 막대 그래프) 그리는 방법을 알아보고자 한다.


   Bar Chart

- 목차 -

1. Bar Chart

2. 3d Bar Chart

3. Style(1~48)


1. Bar Chart

1) 수직, 수평 바 차트

openpyxl에서는 BarChart를 이용하여 바 차트(Bar Chart, 막대 그래프)를 만들 수 있다. 아래 코드를 통해 사용법을 알 수 있다.

 

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

 

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference

wb = Workbook(write_only=True)
ws = wb.create_sheet()

## 데이터 생성
rows = [
    ('Number', 'Batch 1', 'Batch 2'),
    (2, 10, 30),
    (3, 40, 60),
    (4, 50, 70),
    (5, 20, 10),
    (6, 10, 40),
    (7, 50, 30),
]

## 데이터 삽입
for row in rows:
    ws.append(row)

## 바차트 생성
chart1 = BarChart() 
chart1.type = "col" ## 수직 바차트
chart1.style = 10 ## 차트 스타일 1~48
chart1.title = "Bar Chart" ## 제목
chart1.y_axis.title = 'Test Number' ## y축 라벨
chart1.x_axis.title = 'Sample Length' ## x축 라벨

## 시각화 대상 데이터 범위 지정
data = Reference(ws, min_col=2, min_row=1, max_row=7, max_col=3)
chart1.add_data(data, titles_from_data=True) ## 데이터 등록
cats = Reference(ws, min_col=1, min_row=2, max_row=7) ## 범주형 데이터 범위
chart1.set_categories(cats) ## 범주형 데이터 설정
chart1.width = 12 ## 차트 폭
chart1.height = 7 ## 차트 높이

## 막대 색상
s1 = chart1.series[0]
s1.graphicalProperties.solidFill = 'ff9900' ## 막대 색상
s2 = chart1.series[1]
s2.graphicalProperties.solidFill = '339944' ## 막대 색상

ws.add_chart(chart1, "A10") ## A10에 차트 삽입

chart2 = BarChart()
chart2.style = 11
chart2.type = "bar" ## 수평 바차트
chart2.title = "Horizontal Bar Chart" ## 타이틀
chart2.y_axis.title = 'Test Number' ## y축 라벨
chart2.x_axis.title = 'Sample Length' ## x축 라벨
chart2.add_data(data, titles_from_data=True) ## 데이터 등록
chart2.set_categories(cats) ## 범주형 데이터 설정
ws.add_chart(chart2, "I10") ## I10에 차트 삽입
wb.save("bar01.xlsx")

 

line 23~30

BarChart 클래스를 생성하고 type 메서드를 통해 수직 또는 수평으로 그릴지 결정한다. col은 수직, bar는 수평 바 차트를 그리게 된다. 그리고 차트 스타일, 타이틀과 x, y축 라벨 그리고 차트 크기를 설정한다. 차트 스타일은 1~48의 정수를 입력하며 각 스타일은 아래에서 소개한다.

 

line 33~36

Reference 클래스를 통해 바 차트를 그리는 참조 데이터를 결정한다. 바 차트는 범주형 데이터를 축으로 하므로 이를 따로 지정한 뒤 set_categories에 넘겨줘야 한다. 

 

line 39~42

막대 색상을 결정한다. add_data를 통해 등록한 데이터 칼럼 개수 만큼 series가 생성되어 있는데 이를 고려하여 인덱스로 접근해줘야 한다. 그리고 각 series별로 graphicalProperties.solidFill을 이용하여 막대 색상을 적용한다.

 

2) 스택 바 차트

이번엔 스택 바 차트를 그려보자. 아래 코드는 openpyxl 에서 제공하는 4가지 종류의 스택 바 차트를 그린 것이다.

 

wb = Workbook(write_only=True)
ws = wb.create_sheet()

rows = [
    ('Number', 'Batch 1', 'Batch 2'),
    (2, 10, 30),
    (3, 40, 60),
    (4, 50, 70),
    (5, 20, 10),
    (6, 10, 40),
    (7, 50, 30),
]


for row in rows:
    ws.append(row)

stack_type = ['stacked', 'standard', 'clustered', 'percentStacked']
for i, st in enumerate(stack_type):
    ## 바차트 생성
    chart1 = BarChart() 
    chart1.type = "col" ## 수직 바차트
    chart1.style = 40 ## 차트 스타일 1~48
    chart1.title = f'{st}' ## 제목
    chart1.y_axis.title = 'Test Number' ## y축 라벨
    chart1.x_axis.title = 'Sample Length' ## x축 라벨

    chart1.grouping = st ## 스택 바 종류
    chart1.overlap = 100 ## 각 막대간 오버랩 정도 스택은 100으로 설정해야 깔끔하다.

    ## 시각화 대상 데이터 범위 지정
    data = Reference(ws, min_col=2, min_row=1, max_row=7, max_col=3)
    chart1.add_data(data, titles_from_data=True) ## 데이터 등록
    cats = Reference(ws, min_col=1, min_row=2, max_row=7) ## 범주형 데이터 범위
    chart1.set_categories(cats) ## 범주형 데이터 설정
    
    if i%2 == 0:
        ws.add_chart(chart1, f"A{10+13*(i//2)}")
    else:
        ws.add_chart(chart1, f"I{10+13*(i//2)}")

wb.save("stack_bar.xlsx")

 

line 28~29

사용법은 앞에서와 비슷하며 다만 grouping이라는 필드에 스택 바 차트 종류를 넣어줘야 한다. 스택 바 차트 종류는 'stacked', 'standard', 'clustered', 'percentStacked'이다. 또한 overlap 필드는 각 그룹 간 막대의 오버랩 정도를 나타내는데 완벽하게 오버랩되도록 100을 넣어줘야 한다. 그래야 깔끔하다.

 

openpyxl-Stacked Bar Chart


2. 3d Bar Chart

openpyxl에서는 3차원 바 차트(막대 그래프)도 지원한다. BarChart3D 클래스를 이용하면 3차원 바 차트를 그릴 수 있다. 코드는 앞에서 살펴본 것과 동일하므로 설명은 생략한다.

 

from openpyxl import Workbook
from openpyxl.chart import Reference, BarChart3D

wb = Workbook()
ws = wb.active

## 데이터 생성
rows = [
    (None, 2013, 2014),
    ("Apples", 5, 4),
    ("Oranges", 6, 2),
    ("Pears", 8, 3)
]

## 데이터 삽입
for row in rows:
    ws.append(row)

## 연속형 데이터, 범주형 데이터 설정
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=4)
titles = Reference(ws, min_col=1, min_row=2, max_row=4)

chart = BarChart3D() ## 바 차트 생성
chart.title = "3D Bar Chart" ## 타이틀
chart.add_data(data=data, titles_from_data=True) ## 데이터 등록
chart.set_categories(titles) ## 범주형 데이터 설정

ws.add_chart(chart, "E5") ## E5에 차트 삽입
wb.save("bar3d.xlsx")

 


3. Style(1~48)

여기서는 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


- 참고 자료 -

Bar and Column Charts - https://openpyxl.readthedocs.io/en/stable/charts/bar.html


댓글


맨 위로