그래프가 왜 필요한가를 이해하는 예제 1

by 박정수

얘들아, 아빠야. 지난번에 line plot 그리는 거 배웠지? 선 하나 그어서 데이터가 어떻게 변하는지 보여주는 거. 그런데 말이다, 세상에는 한 그림에 담기 어려운 이야기들이 있어.


food_one.png

예를 들어볼게. 둘째가 하루 종일 공부한 시간과 언니가 그날 먹은 초콜릿 칼로리를 비교하고 싶어 해. 둘째는 나는 열심히 공부하고 있는데도 그림으로 보면 많이 파란 수평선처럼 편편해 보여. 그런데 언니는 뭔가 많이 증가하는 듯한 그림이야. 언니는 초콜릿을 너무 많이 먹고 있다는 증거이지.


그런데 문제는 같은 한 그래프에 그리면 외운 단어수가 (빨강선)의 움직임이 바닥에 깔려서 움직임이 잘 안 보여.


이럴 때 필요한 게 이중 Y축이야. Y축이 두 개가 있다는 왜 필요하나 하면 단 시리즈는 1~10 정도의 범위로 움직이닌데, 다른 한 시리즈는 200~500 사이를 움직이니까 비교하기 어려운 거야. 마치 서장훈 나라와 이수근 나라사람들이 모이면 이수근 나라사람들이 안 보이는 것과 같은 이치야. 그래서 어떻게 하면 이수근 나라와 서장훈 나라를 분리해서 그리면서 이수근 나라사람들도 작지만 키의 차이가 있다 이런 것을 보여줘야지 정확한 정보를 전달하는 것이되. 그래프는 만들어졌고, 보고서 등에서 필요한 거야. 이것이 인공지능시대에 시각화(Visialization)가 더 중요해진 거야. 3차원그래프, 움직이는 그림 등 보고를 받는 사람이 가장 쉽게 이 그래프를 보면서 아 둘째는 공부를 열심히 하고 있고 첫째는 운동을 더 해야겠네. 이런 판단을 할 수 있도록 만들어 주는 거지.


자, 상황에서 서장훈 나라와 이수근 나라를 구분하기 위해 간단히 그럴 땐 Y축을 오른편에 하나 더 만들면 돼.


import matplotlib.pyplot as plt

import numpy as np # 데이터 준비 (일주일간)

days = ['월', '화', '수', '목', '금', '토', '일']

words = [10, 12, 8, 15, 20, 25, 30] # 영어 단어 개수

calories = [300, 280, 350, 290, 310, 400, 450] # 초콜릿 칼로리

# 그림 그리기

fig, ax1 = plt.subplots(figsize=(10, 6)) # 첫 번째 Y축 (왼쪽) - 영어 단어 color = 'tab:blue' ax1.set_xlabel('요일', fontsize=12)

ax1.set_ylabel('외운 영어 단어 (개)', color=color, fontsize=12)

ax1.plot(days, words, color=color, marker='o', linewidth=2, label='영어 단어') ax1.tick_params(axis='y', labelcolor=color) ax1.grid(True, alpha=0.3)

# 두 번째 Y축 (오른쪽) - 초콜릿 칼로리

ax2 = ax1.twinx()

# 같은 X축을 공유하는 두 번째 Y축 생성

color = 'tab:red' ax2.set_ylabel('먹은 초콜릿 (칼로리)', color=color, fontsize=12)

ax2.plot(days, calories, color=color, marker='s', linewidth=2, linestyle='--', label='초콜릿') ax2.tick_params(axis='y', labelcolor=color)

# 제목과 범례

plt.title('일주일간 언니의 공부 vs 동생의 간식', fontsize=14, fontweight='bold') fig.legend(loc='upper left', bbox_to_anchor=(0.15, 0.85))

plt.tight_layout()

plt.savefig(''food.png", dpi=300)

plt.show()


결과는

food.png

Y축이 좌우로 두 개가 되었죠?

이제는 파랑선처럼 둘째가 정말 매일 열심히 단어를 외우고 있구나, 그리고 언니는 초콜릿을 적게 먹겠다고 약속을 했는데 오히려 더 많이 먹고 있네......


이 그래프를 선이 아니고 막대로 바꾸면 어떨까? 하루하루를 ㅂ지교하는 것은 Bar plot이 유리한데 일정기간 동안의 증가나 하락을 표시 가는 것은 역시 line plot이 유리한 것 같아.

food_3.png

절대로 외우지 말고, 내용을 이해해야 해요. 그러면 copy and paste를 해서 나에게 맞는 그래프를 그릴 수가 있어요. 이 bar Plot도 chatGPT에게 이 코드를 bar plot으로 바꿔주세요 하고 아빠가 준 코드를 copy & paste 하면 알아서 바꿔 줄 거야. 요즘 인공지능 세상은 원하는 사람에게 원하는 것 이상을 주는 세상이야.

도전해 봐.




그리고 이 코드를 GEMINI에게 해설을 해 달라고 부탁을 했어요. 다음은 대답입니다.

이 코드를 초보자들을 위해 해설해 주세요

네, 초보자들을 위해 코드를 자세히 설명해 드릴게요. 이 코드는 일주일 동안 언니가 외운 영어 단어 수와 동생이 먹은 초콜릿 칼로리를 하나의 그래프에 시각화하는 코드입니다. 두 가지 다른 종류의 데이터를 효과적으로 비교하기 위해 두 개의 Y축을 사용했어요.


각 부분에 대한 설명은 다음과 같습니다:

import matplotlib.pyplot as plt와 import numpy as np: matplotlib.pyplot은 파이썬에서 그래프를 그리는 데 사용되는 라이브러리입니다. 보통 plt라는 별명으로 줄여서 사용해요. numpy는 수치 계산을 효율적으로 할 수 있게 돕는 라이브러리인데, 여기서는 직접적으로 사용되지는 않았지만, 파이썬에서 데이터를 다룰 때 흔히 함께 사용됩니다.

데이터 준비 (일주일간): days = ['월', '화', '수', '목', '금', '토', '일']: 그래프의 X축에 표시될 요일 데이터를 리스트로 만듭니다. words = [10, 12, 8, 15, 20, 25, 30]: 각 요일에 외운 영어 단어 개수를 리스트로 저장합니다. 이 데이터는 첫 번째 Y축에 사용될 거예요. calories = [300, 280, 350, 290, 310, 400, 450]: 각 요일에 먹은 초콜릿 칼로리를 리스트로 저장합니다. 이 데이터는 두 번째 Y축에 사용될 거예요.

그림 그리기 기본 설정 (fig, ax1 = plt.subplots(figsize=(10, 6))): plt.subplots()는 그래프를 그리기 위한 '그림 (figure)'과 '축 (axes)' 객체를 생성합니다. fig는 전체 그림 공간을, ax1은 그 안에 그려질 그래프 공간(첫 번째 축)을 의미해요. figsize=(10, 6)는 그래프의 가로, 세로 크기를 지정하는 것입니다. (단위는 인치).

첫 번째 Y축 (왼쪽) - 영어 단어 (ax1 관련 코드): color = 'tab:blue': 이 축에 그려질 선의 색상을 파란색으로 지정합니다. ax1.set_xlabel('요일', fontsize=12): X축의 라벨을 '요일'로 설정하고 글자 크기를 12로 지정합니다. ax1.set_ylabel('외운 영어 단어 (개)', color=color, fontsize=12): 첫 번째 Y축의 라벨을 '외운 영어 단어 (개)'로 설정하고, 선 색상과 같은 파란색으로 지정합니다. ax1.plot(days, words, color=color, marker='o', linewidth=2, label='영어 단어'): days를 X축, words를 Y축으로 하여 선 그래프를 그립니다. 'o'는 각 데이터 포인트를 원형 마커로 표시하라는 뜻이고, linewidth=2는 선의 두께를, label='영어 단어'는 범례에 표시될 이름을 지정합니다. ax1.tick_params(axis='y', labelcolor=color): Y축 눈금 라벨의 색상을 선 색상과 동일하게 설정합니다. ax1.grid(True, alpha=0.3): 그래프에 격자무늬를 추가하여 데이터를 읽기 쉽게 합니다. alpha=0.3은 투명도를 나타냅니다.

두 번째 Y축 (오른쪽) - 초콜릿 칼로리 (ax2 관련 코드): ax2 = ax1.twinx(): 이것이 중요한 부분입니다! ax1.twinx()는 ax1과 X축을 공유하지만, 독립적인 두 번째 Y축(ax2)을 생성합니다. 이를 통해 두 종류의 데이터를 하나의 그래프에 깔끔하게 그릴 수 있어요. color = 'tab:red': 두 번째 축에 그려질 선의 색상을 빨간색으로 지정합니다. ax2.set_ylabel('먹은 초콜릿 (칼로리)', color=color, fontsize=12): 두 번째 Y축의 라벨을 '먹은 초콜릿 (칼로리)'로 설정하고 빨간색으로 지정합니다. ax2.plot(days, calories, color=color, marker='s', linewidth=2, linestyle='--', label='초콜릿'): days를 X축, calories를 Y축으로 하여 선 그래프를 그립니다. 's'는 각 데이터 포인트를 사각형 마커로 표시하고, linestyle='--'는 선을 점선으로 표시하라는 뜻입니다. ax2.tick_params(axis='y', labelcolor=color): 두 번째 Y축 눈금 라벨의 색상도 선 색상과 동일하게 설정합니다.

제목과 범례: plt.title('일주일간 언니의 공부 vs 동생의 간식', fontsize=14, fontweight='bold'): 그래프 전체의 제목을 설정하고 글자 크기와 굵기를 지정합니다. fig.legend(loc='upper left', bbox_to_anchor=(0.15, 0.85)): 그래프에 범례(label)를 표시합니다. loc는 범례 위치를, bbox_to_anchor는 범례를 더 정확한 위치에 놓을 때 사용합니다.

레이아웃 조정 및 그래프 표시: plt.tight_layout(): 그래프 요소들이 겹치지 않도록 자동으로 레이아웃을 조정해 줍니다. plt.show(): 지금까지 설정한 모든 내용을 바탕으로 그래프를 화면에 표시합니다.

이 코드를 통해 언니의 공부량과 동생의 간식 섭취량을 요일별로 한눈에 비교해 볼 수 있습니다. 예를 들어, 주말에 단어 암기량이 늘고 초콜릿 칼로리도 함께 늘어나는 경향을 볼 수 있네요!

이전 14화Python으로 그래프를 마음껏 그려보기