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()
전체 데이터 표시
역대 최고 온도 표시
역대 최저 온도 표시