[미래유망] Plotly 기상청 따라 그래프 만들어보기

돼지인간·2025년 6월 12일

미래유망

목록 보기
33/41

코드

import pandas as pd
import plotly.graph_objects as go

# 1. CSV 읽기
data = pd.read_csv('gisangchung.csv', skiprows=6, encoding='utf-8')

# 2. 열 이름 정리 (불필요한 공백 제거)
data.columns = data.columns.str.strip()

# 3. 날짜 형식 변환
data['날짜'] = pd.to_datetime(data['날짜'], errors='coerce')

# 4. 필요한 열만 추출, 결측치 제거
data = data[['날짜', '최저기온(℃)', '평균기온(℃)', '최고기온(℃)']].dropna()

# 5. 역대 최고/최저 기온과 해당 날짜 찾기
max_temp = data['최고기온(℃)'].max()
min_temp = data['최저기온(℃)'].min()

max_temp_row = data[data['최고기온(℃)'] == max_temp]
min_temp_row = data[data['최저기온(℃)'] == min_temp]

fig = go.Figure()

# 전체 데이터 트레이스 (기본 선들)
fig.add_trace(go.Scatter(
    x=data['날짜'],
    y=data['최저기온(℃)'],
    mode='lines',
    name='최저기온',
))
fig.add_trace(go.Scatter(
    x=data['날짜'],
    y=data['평균기온(℃)'],
    mode='lines',
    name='평균기온',
))
fig.add_trace(go.Scatter(
    x=data['날짜'],
    y=data['최고기온(℃)'],
    mode='lines',
    name='최고기온',
))

# 역대 최고기온 포인트 (숨김 상태)
fig.add_trace(go.Scatter(
    x=max_temp_row['날짜'],
    y=max_temp_row['최고기온(℃)'],
    mode='markers',
    marker=dict(color='red', size=12, symbol='star'),
    name='역대 최고기온',
    visible=False
))

# 역대 최저기온 포인트 (숨김 상태)
fig.add_trace(go.Scatter(
    x=min_temp_row['날짜'],
    y=min_temp_row['최저기온(℃)'],
    mode='markers',
    marker=dict(color='blue', size=12, symbol='star'),
    name='역대 최저기온',
    visible=False
))

# 레이아웃 — 제목 및 축
fig.update_layout(
    title=dict(
        text="기온분석 기본 서울(108) 일자료 기간 : 20250513~20250611",
        y=0.95,
        x=0.5,
        xanchor='center',
        yanchor='top'
    ),
    yaxis_title="(°C)",
    hovermode="x unified",
    xaxis=dict(rangeslider_visible=True),
)

# 레이아웃 — 범례
fig.update_layout(
    legend_orientation="h",
    legend_yanchor="top",
    legend_y=1.1,
    legend_x=0.5,
    legend_xanchor='center',
    legend_entrywidth=70,
)

# 레이아웃 — 버튼 (왼쪽 세로 정렬)
fig.update_layout(
    updatemenus=[
        dict(
            type="buttons",
            direction="down",  # 세로로 버튼 배치
            x=1,               # 좌측 끝
            y=1,               # 상단
            xanchor='left',
            yanchor='top',
            buttons=[
                dict(
                    label="전체 데이터",
                    method="update",
                    args=[{"visible": [True, True, True, False, False]},
                          {"title": "전체 데이터"}]
                ),
                dict(
                    label="역대 최고기온",
                    method="update",
                    args=[{"visible": [False, False, False, True, False]},
                          {"title": f"역대 최고기온: {max_temp}℃ ({max_temp_row['날짜'].dt.strftime('%Y-%m-%d').values[0]})"}]
                ),
                dict(
                    label="역대 최저기온",
                    method="update",
                    args=[{"visible": [False, False, False, False, True]},
                          {"title": f"역대 최저기온: {min_temp}℃ ({min_temp_row['날짜'].dt.strftime('%Y-%m-%d').values[0]})"}]
                ),
            ],
            showactive=True,
        ),
    ]
)

# 축 스타일
fig.update_xaxes(showline=True, linewidth=1, linecolor='black', tickformat="%Y-%m-%d")
fig.update_yaxes(showline=True, linewidth=1, linecolor='black', ticks="outside", range=[0, 35])

fig.show()

실행결과

전체 데이터 표시

역대 최고 온도 표시

역대 최저 온도 표시


profile
안녕하세요 게임개발을 공부하고 있는 돼지인간 입니다.

0개의 댓글