본문 바로가기
아래아한글 자동화/python+hwp 중급

한/글 표로 차트 그리기(확산형 누적막대)

by 일코 2022. 12. 18.
반응형

다음과 같은 설문데이터가 있습니다.

학습양식의_활용_자료_샘플.xlsx
0.02MB

 

시각화를 해 보고 싶은데 일반적인 누적막대로는 행간의 차이가 뭐랄까

극적이지 않습니다.

그래서 경계선으로 정렬해서 좌우로 튀어나오게 아래와 같은 차트를 만들어 보고 싶었습니다.

자주 사용하는 "수업 안내"가 훨씬 강조된 느낌입니다.

가장 자주 사용하는 "수업 안내"의 점유율이 높다는 정보가

시각적으로 훨씬 더 두드러지는 느낌입니다.

재미있게도 위 이미지는 아래아한글 표로 직접 만든 차트입니다.

구현을 고민하는 데 시간이 많이 들기는 했지만

코드 자체는 길지 않을뿐더러, 생각보다 간단합니다.

코드와 시연화면을 보여드리겠습니다.

 

파이썬 코드

import os
from time import sleep

import win32com.client as win32
import pandas as pd

def shift(percent, direction):
    percent -= 50
    percent = int(percent / 1.7)
    hwp.HAction.Run("TableCellBlock")
    for i in range(abs(percent)):
        sleep(0.01)
        if direction == "left":
            if percent < 0:
                hwp.HAction.Run("TableResizeCellRight")
            else:
                hwp.HAction.Run("TableResizeCellLeft")
        elif direction == "right":
            if percent < 0:
                hwp.HAction.Run("TableResizeCellLeft")
            else:
                hwp.HAction.Run("TableResizeCellRight")
        else:
            pass

hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
hwp.Run("FileNew")
hwp.Open(os.path.join(os.getcwd(), "./학습양식의_활용_샘플.hwp"))
df = pd.read_excel("./학습양식의_활용_자료_샘플.xlsx")

sleep(3)
field_list = [i for i in hwp.GetFieldList().split('\x02') if not i.isdigit()]

for i in field_list:
    if i.endswith('-'):
        hwp.PutFieldText(i, str(int(df[df["구분"] == i[:-1]]["사용안함/거의안함(%)"])) + "%")
    else:
        hwp.PutFieldText(i, str(int(df[df["구분"] == i[:-1]]["가끔사용/자주사용(%)"])) + "%")

for i in range(2*len(df)):
    if i < len(df):
        hwp.MoveToField(str(i))
        shift(df.iloc[i]["사용안함/거의안함(%)"], "left")
    else:
        hwp.MoveToField(str(i))
        shift(df.iloc[i-len(df)]["가끔사용/자주사용(%)"], "right")

print("완료되었습니다.")
파이썬이나 판다스 데이터프레임에 익숙하신 분들을 대상으로 하는 참고용 포스팅이므로
설명은 생략합니다.

 

시연화면

이렇게 템플릿을 거의 만들어두고, 엑셀파일의 정보를 통해 필드와 셀너비 조절 정도만 조작하면

제법 괜찮은 차트를 빠르게 뽑아낼 수 있겠습니다.

로컬에서 직접 실행해보고 싶은 분들을 위해

코드와 한/글 파일도 아래 첨부해 둡니다.

확산형누적막대(학습양식의활용).zip
0.24MB

 

마치며

회사에서, 또 강의를 위해 차트를 만들 때에는 엑셀보다는 matplotlib을 사용하려고 의식적으로 노력했습니다.

도구를 탓할 수는 없는 노릇이지만, 제겐 matplotlib이 상당히 어렵게 느껴졌습니다. 사실 지금도 그렇고요.

그나마 matplotlib을 쓸 수 있게 실낱같은 희망을 주신 분이 있는데

바로 한국에너지기술연구원의 이제현님입니다. 이 분은 정말 우리나라 최고의 matplotlib 장인이라고 생각됩니다.

제현님의 블로그를 링크로 달아둡니다.

 

Matplotlib-Tools

원문: by Aurélien Geron (Link) Translated by Chansung PARK (Link) Object Oriented API Addition by Jehyun LEE (Link) Tools - matplotlib 이 노트북은 matplotlib 라이브러리를 사용하여 아름다운 그래프를 그리는 방법을 보여줍니

jehyunlee.github.io

 

행복한 하루 되세요!

반응형

댓글0