[미래유망] Plotly #08 Scienfitic Chart

돼지인간·2025년 6월 20일

미래유망

목록 보기
38/41
post-thumbnail

Contour Plot

Contour Plot은 등치선 또는 등고선 그래프를 뜻합니다. 3차원 데이터를 2차원 공간산에 분포하는 동일한 값을 가지는 인접한 지점을 연속적으로 이어 구성한 선 입니다.

기본 사용법

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np

data = pd.read_csv('denggosun.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data[['공간좌표_XMIN', '공간좌표_XMAX', '공간좌표_YMIN', '공간좌표_YMAX', '등고선 값']].dropna()
data = data.head(10)

x_min = data['공간좌표_XMIN'].min()  # 최소 X값
x_max = data['공간좌표_XMAX'].max()  # 최대 X값
y_min = data['공간좌표_YMIN'].min()  # 최소 Y값
y_max = data['공간좌표_YMAX'].max()  # 최대 Y값

# np.linspace로 범위를 세분화 (100개의 간격으로 나누기)
xRange = np.linspace(x_min, x_max, num=100)  # X 범위
yRange = np.linspace(y_min, y_max, num=100)  # Y 범위

fig = go.Figure()

# 그래프 그리기
fig.add_trace(go.Contour(
        z=data['등고선 값'],
        x=xRange,
        y=yRange
))

# 알아보기 쉽게 하기 위해 추가한 것(제목과 날짜 축 관리)
fig.update_layout(
    title=dict(
        text="충청북도 단양군 국가공간정보통합체계 등고선"
    )
)

fig.show()

Colormap 변경하기

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np

data = pd.read_csv('denggosun.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data[['공간좌표_XMIN', '공간좌표_XMAX', '공간좌표_YMIN', '공간좌표_YMAX', '등고선 값']].dropna()
data = data.head(10)

x_min = data['공간좌표_XMIN'].min()  # 최소 X값
x_max = data['공간좌표_XMAX'].max()  # 최대 X값
y_min = data['공간좌표_YMIN'].min()  # 최소 Y값
y_max = data['공간좌표_YMAX'].max()  # 최대 Y값

# np.linspace로 범위를 세분화 (100개의 간격으로 나누기)
xRange = np.linspace(x_min, x_max, num=100)  # X 범위
yRange = np.linspace(y_min, y_max, num=100)  # Y 범위

fig = go.Figure()

# 그래프 그리기
fig.add_trace(go.Contour(
        z=data['등고선 값'],
        x=xRange,
        y=yRange,
        colorscale='Hot'
))

# 알아보기 쉽게 하기 위해 추가한 것(제목과 날짜 축 관리)
fig.update_layout(
    title=dict(
        text="충청북도 단양군 국가공간정보통합체계 등고선"
    )
)

fig.show()

컬러맵 커스터마이징하기

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np

data = pd.read_csv('denggosun.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data[['공간좌표_XMIN', '공간좌표_XMAX', '공간좌표_YMIN', '공간좌표_YMAX', '등고선 값']].dropna()
data = data.head(10)

x_min = data['공간좌표_XMIN'].min()  # 최소 X값
x_max = data['공간좌표_XMAX'].max()  # 최대 X값
y_min = data['공간좌표_YMIN'].min()  # 최소 Y값
y_max = data['공간좌표_YMAX'].max()  # 최대 Y값

colorscale = [[0, 'gold'], [0.5, 'mediumturquoise'], [1, 'lightsalmon']]


# np.linspace로 범위를 세분화 (100개의 간격으로 나누기)
xRange = np.linspace(x_min, x_max, num=100)  # X 범위
yRange = np.linspace(y_min, y_max, num=100)  # Y 범위

fig = go.Figure()

# 그래프 그리기
fig.add_trace(go.Contour(
        z=data['등고선 값'],
        x=xRange,
        y=yRange,
        colorscale=colorscale
))

# 알아보기 쉽게 하기 위해 추가한 것(제목과 날짜 축 관리)
fig.update_layout(
    title=dict(
        text="충청북도 단양군 국가공간정보통합체계 등고선"
    )
)

fig.show()

Contour Line 만 그리기

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np

data = pd.read_csv('denggosun.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data[['공간좌표_XMIN', '공간좌표_XMAX', '공간좌표_YMIN', '공간좌표_YMAX', '등고선 값']].dropna()
data = data.head(10)

x_min = data['공간좌표_XMIN'].min()  # 최소 X값
x_max = data['공간좌표_XMAX'].max()  # 최대 X값
y_min = data['공간좌표_YMIN'].min()  # 최소 Y값
y_max = data['공간좌표_YMAX'].max()  # 최대 Y값



# np.linspace로 범위를 세분화 (100개의 간격으로 나누기)
xRange = np.linspace(x_min, x_max, num=100)  # X 범위
yRange = np.linspace(y_min, y_max, num=100)  # Y 범위

fig = go.Figure()

# 그래프 그리기
fig.add_trace(go.Contour(
        z=data['등고선 값'],
        x=xRange,
        y=yRange,
        contours_coloring='lines',
        line_width=4
))

# 알아보기 쉽게 하기 위해 추가한 것(제목과 날짜 축 관리)
fig.update_layout(
    title=dict(
        text="충청북도 단양군 국가공간정보통합체계 등고선"
    )
)

fig.show()

Contour Line Label 텍스트 넣기

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np

data = pd.read_csv('denggosun.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data[['공간좌표_XMIN', '공간좌표_XMAX', '공간좌표_YMIN', '공간좌표_YMAX', '등고선 값']].dropna()
data = data.head(10)

x_min = data['공간좌표_XMIN'].min()  # 최소 X값
x_max = data['공간좌표_XMAX'].max()  # 최대 X값
y_min = data['공간좌표_YMIN'].min()  # 최소 Y값
y_max = data['공간좌표_YMAX'].max()  # 최대 Y값



# np.linspace로 범위를 세분화 (100개의 간격으로 나누기)
xRange = np.linspace(x_min, x_max, num=100)  # X 범위
yRange = np.linspace(y_min, y_max, num=100)  # Y 범위

fig = go.Figure()

# 그래프 그리기
fig.add_trace(go.Contour(
        z=data['등고선 값'],
        x=xRange,
        y=yRange,
        contours_showlabels = True,
        contours_labelfont_size = 20,
        contours_labelfont_color = 'white'
))

# 알아보기 쉽게 하기 위해 추가한 것(제목과 날짜 축 관리)
fig.update_layout(
    title=dict(
        text="충청북도 단양군 국가공간정보통합체계 등고선"
    )
)

fig.show()

Contour 범위 및 간격 지정

import plotly.graph_objects as go

# Figure 생성
fig = go.Figure()

# 그래프 생성
fig.add_trace(go.Contour(
        z=[[10, 10.625, 12.5, 15.625, 20],
           [5.625, 6.25, 8.125, 11.25, 15.625],
           [2.5, 3.125, 5., 8.125, 12.5],
           [0.625, 1.25, 3.125, 6.25, 10.625],
           [0, 0.625, 2.5, 5.625, 10]],
        x=[-9, -6, -5 , -3, -1],
        y=[0, 1, 4, 5, 7],
        colorscale='Hot',
        contours_start=0,
        contours_end=8,
        contours_size=0.5,))



fig.show()

Contour Line smoothing 처리하기

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np

z =   [[2, 4, 7, 12, 13, 14, 15, 16],
       [3, 1, 6, 11, 12, 13, 16, 17],
       [4, 2, 7, 7, 11, 14, 17, 18],
       [5, 3, 8, 8, 13, 15, 18, 19],
       [7, 4, 10, 9, 16, 18, 20, 19],
       [9, 10, 5, 27, 23, 21, 21, 21],
       [11, 14, 17, 26, 25, 24, 23, 22]]

fig = make_subplots(rows=1, cols=2,
                    subplot_titles=('Without Smoothing', 'With Smoothing'))

fig.add_trace(go.Contour(z=z, line_smoothing=0), 1, 1)
fig.add_trace(go.Contour(z=z, line_smoothing=1.3), 1, 2)

fig.show()

Contour 결측치 부분 처리하기

import plotly.graph_objs as go
from plotly.subplots import make_subplots

fig = make_subplots(rows=1, cols=2, subplot_titles=('connectgaps = False',
                                                        'connectgaps = True'))
z = [[None, None, None, 12, 13, 14, 15, 16],
     [None, 1, None, 11, None, None, None, 17],
     [None, 2, 6, 7, None, None, None, 18],
     [None, 3, None, 8, None, None, None, 19],
     [5, 4, 10, 9, None, None, None, 20],
     [None, None, None, 27, None, None, None, 21],
     [None, None, None, 26, 25, 24, 23, 22]]

fig.add_trace(go.Contour(z=z, showscale=False), 1, 1)
fig.add_trace(go.Contour(z=z, showscale=False, connectgaps=True), 1, 2)

fig.show()


Heatmap

Heatmaps 은 열을 뜻하는 히트(heat)와 지도를 뜻하는 맵(map)을 결합시킨 단어로, 2차원 평면 위애 색을 활용하여 다양한 정보를 표현하는 방법입니다

Matrix Heatmap 사용방법

import pandas as pd
import plotly.graph_objects as go
import numpy as np

# 데이터 불러오기 및 정리
data = pd.read_csv('on1000.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data.set_axis(labels=data['온천명'], axis=0)
data = data[['면적(제곱미터)', '온도(섭씨)']]
data = data.head(3)

fig = px.imshow(data,
                labels={'color': '값'}, 
                title="온천별 면적 및 온도")


fig.update_traces(
    hovertemplate="%{x}<br>값: %{z}<br>종류: %{y}"
)
fig.show()

Density Heatmap 사용방법

import pandas as pd
import plotly.graph_objects as go
import numpy as np
import plotly.express as px

# 데이터 불러오기 및 정리
data = pd.read_csv('on1000.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data.set_axis(labels=data['온천명'], axis=0)
data = data[['면적(제곱미터)', '온도(섭씨)']]
data = data.head(3)

fig = px.density_heatmap(data,
                labels={'color': '값'},
                title="온천별 면적 및 온도",
                )


fig.update_traces(
    hovertemplate="%{x}<br>값: %{z}<br>종류: %{y}"
)
fig.show()

X/Y 축 영역 분할 갯수 변경하기

import pandas as pd
import plotly.graph_objects as go
import numpy as np
import plotly.express as px

# 데이터 불러오기 및 정리
data = pd.read_csv('on1000.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data.set_axis(labels=data['온천명'], axis=0)
data = data[['면적(제곱미터)', '온도(섭씨)']]
data = data.head(3)

fig = px.density_heatmap(data,
                labels={'color': '값'},
                title="온천별 면적 및 온도",
                nbinsx=30, nbinsy=30
                )


fig.update_traces(
    hovertemplate="%{x}<br>값: %{z}<br>종류: %{y}"
)
fig.show()

Z 값 추가하여 영역별 평균/Min/Max/Sum 구하기

import pandas as pd
import plotly.graph_objects as go
import numpy as np
import plotly.express as px

# 데이터 불러오기 및 정리
data = pd.read_csv('on1000.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data.set_axis(labels=data['온천명'], axis=0)
data = data[['지정일','면적(제곱미터)', '온도(섭씨)']]
data = data.head(3)

fig = px.density_heatmap(data_frame=data, x="지정일", y="온도(섭씨)", z="면적(제곱미터)", histfunc="avg")

fig.update_traces(
    hovertemplate="%{x}<br>값: %{z}<br>종류: %{y}"
)
fig.show()

여러개로 나눠 그리기(Facet)

import pandas as pd
import plotly.graph_objects as go
import numpy as np
import plotly.express as px

# 데이터 불러오기 및 정리
data = pd.read_csv('on1000.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data.set_axis(labels=data['온천명'], axis=0)
data = data[['지정일','면적(제곱미터)', '온도(섭씨)', '성분']]
data = data.head(3)

fig = px.density_heatmap(data_frame=data, x="지정일", y="온도(섭씨)", facet_row="지정일", facet_col="성분")

fig.update_traces(
    hovertemplate="%{x}<br>값: %{z}<br>종류: %{y}"
)
fig.show()

Heatmap 위에 텍스트 넣기

import pandas as pd
import plotly.graph_objects as go
import numpy as np
import plotly.express as px

# 데이터 불러오기 및 정리
data = pd.read_csv('on1000.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data.set_axis(labels=data['온천명'], axis=0)
data = data[['면적(제곱미터)', '온도(섭씨)']]
data = data.head(3)

fig = px.imshow(data,
                labels={'color': '값'}, 
                title="온천별 면적 및 온도",
                text_auto=True
)


fig.update_traces(
    hovertemplate="%{x}<br>값: %{z}<br>종류: %{y}"
)
fig.show()

Aspect Ratio 자동 지정하기, Colormap 지정하기

import pandas as pd
import plotly.graph_objects as go
import numpy as np
import plotly.express as px

# 데이터 불러오기 및 정리
data = pd.read_csv('on1000.csv', encoding='utf-8')
data.columns = data.columns.str.strip()
data = data.set_axis(labels=data['온천명'], axis=0)
data = data[['면적(제곱미터)', '온도(섭씨)']]
data = data.head(3)

fig = px.imshow(data,
                labels={'color': '값'}, 
                title="온천별 면적 및 온도",
                color_continuous_scale="Viridis", # colormap 지정
                aspect="auto" # 사이즈 자동 조정
)


fig.update_traces(
    hovertemplate="%{x}<br>값: %{z}<br>종류: %{y}"
)
fig.show()

Radar Chart

Radar Chart는 Spider Plot 또는 Star Plot 이라고도 불리며 한국말로는 방사형 차트 입니다.
축에 매핑된 3개 이상의 정량적 변수에 대한 다변량 데이터를 표시합니다. 해당 제품, 서비스 또는 스포츠 선수 능력치와 같은 유사점 차이점 및 이상값을 한눈에 파악이 쉽습니다.

기본 사용 방법

import pandas as pd
import plotly.express as px
import chart_studio
import chart_studio.plotly as py
import chart_studio.tools as tls

# 데이터 로드 및 정리
data = pd.read_csv('helath.csv', encoding='utf-8')
data.columns = data.columns.str.strip()

# 필요한 열만 선택
cols = ['왕복오래달리기_남', '스텝검사_남', '앉아윗몸앞으로굽히기_남',
        '윗몸말아올리기_남', '악력_남', '50미터달리기_남', '제자리멀리뛰기_남']
data = data[cols].dropna().head(1)

melted = data.T.reset_index()
melted.columns = ['항목', '값']

# 레이더 차트 그리기
fig = px.line_polar(melted, r='값', theta='항목', line_close=True)

fig.update_layout(
    title="초등학교 5학년 남학생의 건강체력 평가",
)

fig.show()

내부 색으로 채우기

import pandas as pd
import plotly.express as px

# 데이터 로드 및 정리
data = pd.read_csv('helath.csv', encoding='utf-8')
data.columns = data.columns.str.strip()

# 필요한 열만 선택
cols = ['왕복오래달리기_남', '스텝검사_남', '앉아윗몸앞으로굽히기_남',
        '윗몸말아올리기_남', '악력_남', '50미터달리기_남', '제자리멀리뛰기_남']
data = data[cols].dropna().head(1)

melted = data.T.reset_index()
melted.columns = ['항목', '값']

# 레이더 차트 그리기
fig = px.line_polar(melted, r='값', theta='항목', line_close=True)

fig.update_layout(
    title="초등학교 5학년 남학생의 건강체력 평가",
)
fig.update_traces(fill='toself')

fig.show()

여러개의 Radar 겹쳐 그리기

import pandas as pd
import plotly.express as px

# 데이터 로드 및 정리
data = pd.read_csv('helath.csv', encoding='utf-8')
data.columns = data.columns.str.strip()

# 필요한 열만 선택
cols = ['왕복오래달리기_남', '스텝검사_남', '앉아윗몸앞으로굽히기_남',
        '윗몸말아올리기_남', '악력_남', '50미터달리기_남', '제자리멀리뛰기_남']
data = data[cols].dropna().head(1)

melted = data.T.reset_index()
melted.columns = ['항목', '값']

# 레이더 차트 그리기
fig = px.line_polar(melted, r='값', theta='항목', line_close=True, color_discrete_sequence=px.colors.sequential.Plasma_r)

fig.update_layout(
    title="초등학교 5학년 남학생의 건강체력 평가",
)
fig.update_traces(fill='toself')

fig.show()

여러개의 Radar 겹쳐 그리기

import plotly.express as px

#데이터 불러오기
df = px.data.wind()

#그래프 그리기
fig = px.line_polar(df, r="frequency", theta="direction", color="strength", line_close=True)

# 내부 색칠하기
fig.update_traces(fill='toself')

fig.show()


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

0개의 댓글