프로그래밍/파이썬

층별 자료를 읽어서 그래프 그래기 chatgpt

do121 2023. 5. 25. 09:11

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# CSV 파일 읽기
df = pd.read_csv('data.csv')

# 날짜를 인덱스로 설정
df.set_index('날짜', inplace=True)

# 데이터가 있는 층의 열만 선택
layers = df.columns[1:]

# 각 층별 데이터를 리스트에 저장
data = []
for layer in layers:
    values = df[layer].dropna().values
    data.append(values)

# 차트 설정
plt.figure(figsize=(10, 6))
colors = plt.cm.rainbow(np.linspace(0, 1, len(data)))

# 각 층별로 선 그래프 그리기
for i, layer_data in enumerate(data):
    plt.plot(layer_data, color=colors[i], label=f'{i+1}층')

# 그래프에 범례 추가
plt.legend()

# 그래프 출력
plt.show()

 

#2 개선

import pandas as pd
import matplotlib.pyplot as plt

import matplotlib.font_manager as fm
# 폰트 경로 설정
font_path = 'C:/Windows/Fonts/NanumGothic.ttf'  # NanumBarunGothic 폰트 경로로 수정해주세요

# 폰트 이름 얻기
font_name = fm.FontProperties(fname=font_path).get_name()

# 폰트 설정
plt.rcParams['font.family'] = font_name

# CSV 데이터를 DataFrame으로 읽어오기
data = pd.read_csv('data.csv')

# 데이터를 layer로 그룹화하기
grouped_data = data.groupby('layer')

# 각 layer별로 차트 그리기
for layer, layer_data in grouped_data:
    # 날짜를 datetime 형식으로 변환
    layer_data['date'] = pd.to_datetime(layer_data['date'])

    # 날짜를 오름차순으로 정렬
    layer_data.sort_values('date', inplace=True)

    # 5개 층마다 차트 분할
    if layer % 5 == 1:
        plt.figure()  # 새로운 차트 생성

    # 2015-1-1 이후의 데이터 필터링
    layer_data = layer_data[layer_data['date'] >= '2015-01-01']

    if not layer_data.empty:  # 필터링 결과가 비어있지 않을 경우에만 차트 그리기
        # 차트 그리기
        plt.plot(layer_data['date'], layer_data['amount'], label=f'층 {layer}')

        # 차트 제목, 축 레이블 등 설정
        if layer % 5 == 1:
            plt.title(f'층별 금액 (층 {layer} - {(layer + 4) if layer <= 15 else "Final"})')
        plt.xlabel('날짜')
        plt.ylabel('금액')
        plt.legend()

        # x축에 날짜 표시
        plt.xticks(rotation=45)
        plt.gca().xaxis.set_major_locator(plt.MaxNLocator(5))  # x축 눈금 개수 설정

        # 데이터 포인트에 날짜 텍스트 표시
        for i, row in layer_data.iterrows():
            plt.text(row['date'], row['amount'], row['date'].strftime('%Y-%m-%d'), ha='center', va='bottom')
            

    # if layer == 1:
    #     break

# 차트 출력
plt.show()