Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python XlsxWriter로 엑셀 시트에 분산형 차트(Scatter Chart) 그리기

분산형 차트(Scatter Plot)는 데카르트 좌표계를 이용해 일반적으로 두 개의 변수 값을 점으로 표시하는 그래프 유형입니다. 각 점에 색상이나 기호 등의 코드를 부여하면 세 번째 변수까지 함께 시각화할 수 있어, 데이터 간의 상관관계나 분포를 파악하는 데 매우 유용합니다.

Python에서는 XlsxWriter 모듈을 사용하면 별도의 Excel 프로그램 없이도 코드만으로 엑셀 파일(.xlsx)을 생성하고, 그 안에 다양한 형태의 차트를 삽입할 수 있습니다. 이번 글에서는 XlsxWriter를 활용해 엑셀 워크시트에 분산형 차트를 그리는 방법을 단계별로 살펴보겠습니다.

전체 예제 코드

아래 예제는 두 개의 데이터 계열(Batch 1, Batch 2)을 하나의 분산형 차트로 표현하고, 차트 제목과 축 레이블, 스타일까지 지정하여 워크시트에 삽입하는 전체 과정을 담고 있습니다.

# xlsxwriter 모듈 임포트
import xlsxwriter

# Workbook()은 생성할 파일명을 인수로 받습니다.
workbook = xlsxwriter.Workbook('chart_scatter.xlsx')

# add_worksheet() 메서드로 새 워크시트를 추가합니다.
worksheet = workbook.add_worksheet()

# add_format() 메서드로 셀 서식 객체를 생성합니다.
# 여기서는 굵은 글씨(bold) 서식 객체를 만듭니다.
bold = workbook.add_format({'bold': 1})

# 데이터 리스트 생성
headings = ['Number', 'Batch 1', 'Batch 2']
data = [
    [2, 3, 4, 5, 6, 7],
    [80, 80, 100, 60, 50, 100],
    [60, 50, 60, 20, 10, 20],
]

# 'A1' 셀부터 굵은 글씨 서식으로 한 행의 데이터를 작성합니다.
worksheet.write_row('A1', headings, bold)

# 'A2', 'B2', 'C2' 셀부터 각각 한 열씩 데이터를 작성합니다.
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])

# add_chart() 메서드로 워크시트에 추가할 차트 객체를 생성합니다.
# 여기서는 분산형(scatter) 차트 객체를 만듭니다.
chart1 = workbook.add_chart({'type': 'scatter'})

# add_series() 메서드로 차트에 데이터 계열을 추가합니다.
# 첫 번째 계열 설정 - 문자열 형식의 범위 지정
# '=Sheet1!$B$1'은 ['Sheet1', 0, 0]과 동일합니다.
# 주의: '='과 'Sheet1' 사이, 'Sheet1'과 '!' 사이에는 공백이 없어야 하며,
# 공백이 들어가면 경고가 발생합니다.
chart1.add_series({
    'name':       '=Sheet1!$B$1',
    'categories': '=Sheet1!$A$2:$A$7',
    'values':     '=Sheet1!$B$2:$B$7',
})

# 두 번째 계열 설정 - 리스트 형식의 대체 문법 사용
# [시트이름, 시작_행, 시작_열, 끝_행, 끝_열]
chart1.add_series({
    'name':       ['Sheet1', 0, 2],
    'categories': ['Sheet1', 1, 0, 6, 0],
    'values':     ['Sheet1', 1, 2, 6, 2],
})

# 차트 제목 추가
chart1.set_title({'name': 'Results of data analysis'})

# X축 레이블 추가
chart1.set_x_axis({'name': 'Test number'})

# Y축 레이블 추가
chart1.set_y_axis({'name': 'Data length (mm)'})

# 엑셀 차트 스타일 설정
chart1.set_style(11)

# 차트를 워크시트에 삽입합니다. 차트의 왼쪽 상단 모서리가 E2 셀에 고정됩니다.
worksheet.insert_chart('E2', chart1)

# 마지막으로 close() 메서드로 엑셀 파일을 저장하고 닫습니다.
workbook.close()

코드 단계별 설명

1. 워크북과 워크시트 생성

xlsxwriter.Workbook()에 파일 이름을 전달해 새 엑셀 파일을 생성하고, add_worksheet() 메서드로 데이터를 입력할 워크시트를 추가합니다.

2. 데이터 작성

write_row() 메서드는 지정한 셀부터 가로 방향으로 데이터를 한 행씩 기록하며, write_column() 메서드는 세로 방향으로 한 열씩 기록합니다. 헤더 행에는 미리 만들어 둔 굵은 글씨(bold) 서식 객체를 적용했습니다.

3. 분산형 차트 생성 및 데이터 계열 추가

add_chart({'type': 'scatter'})로 분산형 차트 객체를 만든 후, add_series() 메서드로 데이터 계열을 추가합니다. 범위를 지정하는 방법은 두 가지가 있습니다.

  • 문자열(A1 스타일) 방식: '=Sheet1!$B$2:$B$7'처럼 엑셀 수식 형태로 지정합니다. 이때 =와 시트 이름 사이에 공백이 들어가면 오류나 경고가 발생하므로 주의해야 합니다.
  • 리스트 방식: ['Sheet1', first_row, first_col, last_row, last_col] 형태로 행·열 인덱스(0부터 시작)를 직접 지정합니다. 프로그래밍적으로 범위를 계산할 때 더 편리합니다.

4. 차트 꾸미기 및 삽입

set_title(), set_x_axis(), set_y_axis() 메서드로 차트 제목과 각 축의 레이블을 지정할 수 있습니다. 또한 set_style() 메서드에 스타일 번호를 전달하면 엑셀이 제공하는 미리 정의된 차트 디자인을 적용할 수 있습니다. 마지막으로 insert_chart() 메서드로 차트를 특정 셀(여기서는 E2)에 삽입하고, close() 메서드를 호출해야 변경 사항이 파일에 실제로 저장됩니다.

실행 결과

위 코드를 실행하면 현재 작업 디렉터리에 chart_scatter.xlsx 파일이 생성됩니다. 파일을 열면 A1:C7 영역에 데이터가 입력되어 있고, E2 셀 위치부터 'Results of data analysis'라는 제목의 분산형 차트가 삽입되어 있는 것을 확인할 수 있습니다. Batch 1과 Batch 2 두 계열이 서로 다른 색상의 점으로 표시되어, 테스트 번호(Test number)에 따른 데이터 길이(Data length)의 분포를 한눈에 비교할 수 있습니다.

마무리

XlsxWriter는 분산형 차트 외에도 선형(line), 막대(bar/column), 원형(pie), 영역(area) 등 다양한 차트 유형을 지원합니다. add_chart()type 옵션 값만 바꾸면 같은 코드 구조로 다른 종류의 차트도 손쉽게 만들 수 있으니, 여러 차트 유형을 응용해 보시기 바랍니다.