[Python 시각화 라이브러리, Plotly] 그래프별 사용법 정리

데이터 분석/Python - 시각화

[Python 시각화 라이브러리, Plotly] 그래프별 사용법 정리

해리누나 2024. 8. 26. 18:31
반응형

[목차]
기본 문법
1. 막대 그래프
2. 선 그래프
3. 산점도 그래프
4. 히스토그램
5. 박스 플롯(상자 수염 차트, 상자 그림)
6. 파이 차트
7. 히트맵

 

📝Plotly

- interactive한 그래프를 그릴 수 있는 파이썬 그래픽 라이브러리

- 파이썬외에도, R, Julia, F#, MATLAB 등에서도 지원

- 최종적으로 HTML 코드로 구현되며 웹 브라우저 상에 표시되기 때문에,
  사용자의 반응에 따른 동적 인터랙티브 데이터 시각화가 가능

 

기본 문법

import plotly.express as px

fig = px.그래프종류(data_frame=데이터 프레임, x='X축 컬럼', y='Y축 컬럼', color=범례 컬럼, 
                   title='제목', labels=dict(X축 컬럼=X축 라벨, Y축 컬럼=Y축 라벨),
                   width=그래프 너비, height=그래프 높이, text_auto=True/False)
fig.show()

📖 그래프 종류:

  •  막대그래프 - px.bar

  •  선 그래프 - px.line

  •  산점도 그래프 - px.scatter

  •  히스토그램 - px.histogram

  •  박스 플롯 - px.box

  •  파이 차트 - px.pie

  •  히트맵 - px.imshow

※ plotly는 한글 설정 필요❌ 

※ plotly에서는 범례가 hue가 아니라 color다.

※ 너비와 높이는 plotly의 경우 픽셀 단위로 그래프를 지정한다. (seaborn 사용했을 때처럼 한자리수로 지정 시 에러뜸)

 


1. 막대그래프

※ plotly는 seaborn과 다르게 countplot을 제공하지 않는다.
   (sns.countplot X 축의 범주별로 행의 개수를 세서 시각화해줌)

※ 따라서 plotly는 groupby를 사용해 별도로 범주별로 행의 개수를 세야 한다.

※ 그 그룹으로 만든 데이터를 이제 그래프 시각화에 사용하는 것이다.

# groupby 예시
region_top10 = data.groupby('시군명').size().reset_index(name = '유기동물 수').sort_values(by = '유기동물 수', ascending = False).head(10)

기본 막대그래프

fig = px.bar(data_frame=region_top10, x='시군명', y='유기동물 수', 
             title = '유기동물 발견 지역 상위10', width=700, height=500)
              
fig.show()

 

막대그래프 - 스타일 커스터마이징

fig = px.bar(data_frame=region_top10, x='시군명', y='유기동물 수', width=700, height=500)
              
# 막대 색상 설정
fig.update_traces(marker=dict(color='#B1510F')) 

# 레이아웃 설정
fig.update_layout(
    title={
        'text': '상위 10 지역별 유기동물 수',
        'y': 0.85,  # 제목의 y축 위치 (0.0 ~ 1.0)
        'x': 0.5,  # 제목의 x축 위치 (0.0 ~ 1.0),
        'font': dict(size=18, family='Arial', color='black'), 
         # 제목 글자 크기 및 폰트, 색상 설정
        'xanchor': 'center',
        'yanchor': 'top'
    },
    xaxis=dict(
        title='지역',  # x축 레이블 설정
        title_font=dict(size=15)  # x축 레이블 글자 크기 설정
    ),
    yaxis=dict(
        title='총 유기동물 수',  # y축 레이블 설정
        title_font=dict(size=15)  # y축 레이블 글자 크기 설정
    ),
    paper_bgcolor='#EBE6E1',  # 그래프 외부의 배경색 설정
    plot_bgcolor='rgba(240, 240, 240, 0.5)'  # 그래프 내부 배경색 설정
)

fig.show()

 

# x축과 y축 레이블 명 좀 더 간편하게 바꾸기
fig = px.bar(data_frame=region_top10, x='시군명', y='유기동물 수', 
             title = '유기동물 발견 지역 상위10', width=700, height=500,
             labels={'시군명': '지역', '유기동물 수': '총 유기동물 수'})

 

데이터 값 그래프에 표기

fig.update_traces(texttemplate='%{y}', textposition='outside') # 데이터 값 위치 설정

 

fig.update_traces(texttemplate='%{y}', textposition='inside')

 

그래프의 그리드 설정

기본 그리드 설정

y축의 그리드 선이 기본적으로 활성화되어있다.

 

그래프 그리드 제거

fig.update_yaxes(showgrid=False) # y축 그리드 비활성화

 

그래프 x,y축 그리드 모두 활성화

fig.update_xaxes(showgrid=True, gridwidth=2, gridcolor='#E1E0DE') # 그리드 굵기 및 색 설정
fig.update_yaxes(showgrid=True, gridwidth=2, gridcolor='#E1E0DE')

 

템플릿 종류

fig = px.bar(data_frame=region_top10, x='지역', y='총 유기동물 수',
             title = '상위10 지역별 유기동물 수', width=700, height=500, template = '템플릿명')

plotly 템플릿

 

plotly_white 템플릿

 

plotly_dark 템플릿

 

Seaborn 템플릿

 

gridon 템플릿

 

presentation 템플릿

 

simple_white 템플릿

 

ggplot2 템플릿

 

범례 적용

fig = px.bar(data_frame=df,x='동물종류', y='체중(kg)', color='성별',
             width=700, height=500, template='ggplot2')
              
# 레이아웃 설정
fig.update_layout(
    title={
        'text': '동물 종류 및 성별 평균 몸무게',
        'y': 0.92, 
        'x': 0.5, 
        'font': dict(size=18)
        'xanchor': 'center',
        'yanchor': 'top'
    }
)

fig.show()

 

레이블 및, 범례 이름 변경

df['성별'] = df['성별'].replace({'F': '암컷', 'M': '수컷', 'Q': '알 수 없음'})

fig = px.bar(data_frame=df,x='동물종류', y='체중(kg)', color='성별',
             width=700, height=500, template='ggplot2',
             labels={'동물종류': '동물 종류', '체중(kg)': '평균 체중(kg)', '성별': '동물 성별'})
             
fig.update_layout(
    title={
        'text': '동물 종류 및 성별 평균 몸무게',
        'y': 0.92, 
        'x': 0.5,  
        'font': dict(size=18), 
        'xanchor': 'center',
        'yanchor': 'top'
    }
)

fig.show()

※  Seaborn과 다르게 범례 지정시 그래프의 그 값이 합쳐져서 나온다.

     각각 별게로 그래프에 나타내고 싶으면 아래처럼👇

# barmode를 그룹으로 지정해주면 된다.
fig = px.bar(data_frame=df,x='동물종류', y='체중(kg)', color='성별',
             width=700, height=500, template='ggplot2', barmode= 'group',
             labels={'동물종류': '동물 종류', '체중(kg)': '평균 체중(kg)', '성별': '동물 성별'})

결과

 


2. 선 그래프

기본 선 그래프

fig = px.line(data_frame=day, x= day['접수일자'].astype(str), y='카운트',title = '일별 유기견 수 추이')
fig.show()

 

선 그래프 - 스타일 커스터마이징

fig = px.line(data_frame=day, x= day['접수일자'].astype(str), y='카운트')
fig.update_traces(line=dict(color='#B1510F', width=2)) # 선 색상 지정 및 굵기 기정

fig.update_layout(
    title={
        'text': '일별 유기견 수 추이',
        'y': 0.93,  # y축 위치 (0.0 ~ 1.0)
        'x': 0.5,  # x축 위치 (0.0 ~ 1.0)
        'xanchor': 'center',
        'yanchor': 'top'
    },
    xaxis_title='날짜',
    yaxis_title='유기견 수',
    paper_bgcolor='#EBE6E1', # 그래프 외부의 배경색 설정
    plot_bgcolor='rgba(240, 240, 240, 0.5)' # 그래프 내부 배경색 설정    
)

fig.show()

 

범례 적용

fig = px.line(data_frame=df, x= '접수월', y='유기동물 수', color= '시군명', color_discrete_sequence=px.colors.qualitative.Set2)
fig.update_traces(line=dict(width=1.5)) 

fig.update_layout(
    title={
        'text': '월별 유기동물 수 추이',
        'y': 0.93,  
        'x': 0.5, 
        'xanchor': "center",
        'yanchor': "top"
    },
    xaxis_title='월',
    yaxis_title='유기동물 수'
)

fig.show()

 


3. 산점도 그래프

산점도 그래프는 그 유명한 펭귄 데이터를 활용해보자.

searborn을 통해 데이터셋을 쉽게 가져올 수 있다.

펭귄 데이터 컬럼 정보

import seaborn as sns

df = sns.load_dataset('penguins')

 

기본 산점도 그래프

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm', title= '부리 길이에 따른 부리 깊이',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)'}, width=700, height=500)
fig.show()

 

산점도 그래프 - 스타일 커스터마이징

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)'}, 
                 width=700, height=500, template='plotly_white')
fig.update_traces(marker=dict(color='#F8766D', size = 8)) # 점 색, 크기 변경

fig.update_layout(
    title={
        'text': '부리 길이에 따른 부리 깊이',
        'y': 0.93,  
        'x': 0.5,  
        'xanchor': 'center',
        'yanchor': 'top'
    }
)

fig.show()

이처럼 기본으로 점의 크기를 변경할 수도 있지만, 다른 컬럼값에 따라 점의 크기를 변경하는 것 또한 가능하다.👇

 

컬럼값에 따른 점의 크기 변경

# size를 사용하면 된다. 
# 어떤 컬럼값에 따라 크기를 변경시켜줄 것인지 그 컬럼명을 적으면 된다.
penguins = penguins.dropna() # size 사용 위해 NaN있는 행 제거

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)'}, 
                 size = 'body_mass_g',
                 width=700, height=500, template='plotly_white')

점의 크기가 너무 부담스러우면 최대 크기(size_max)를 지정해줘서 크기에 제한점을 두면 된다. 👇

 

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)'}, 
                 size = 'body_mass_g', size_max = 15,
                 width=700, height=500, template='plotly_white')

 

범례 적용

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm', color='sex',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)','sex':'성별'}, 
                 color_discrete_sequence=px.colors.qualitative.Set2,
                 width=700, height=500, template='plotly_white')
fig.update_traces(marker=dict(size = 8))

 

점 스타일 지정하기

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm', color = 'island', symbol='sex',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)','sex':'성별', 'island' : '서식지'}, 
                 color_discrete_sequence=px.colors.qualitative.Set2,
                 width=700, height=500, template='plotly_white')
fig.update_traces(marker=dict(size = 7))

※ seaborn에서는 style로 스타일을 지정해줬는데, plotly에서는 symbol로 지정해준다.

 

그래프 나눠서 나타내기

한 컬럼을 기준으로 그래프를 나눠서 그려줄 수 도 있다. 👇

 

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm', color='sex',  facet_col='island',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)','sex':'성별', 'island' : '서식지'}, 
                 color_discrete_sequence=px.colors.qualitative.Set2,
                 width=700, height=500, template='plotly_white')
fig.update_traces(marker=dict(size = 7))

fig.update_layout(
    title={
        'text': '부리 길이에 따른 부리 깊이',
        'y': 0.97,  
        'x': 0.5, 
        'xanchor': 'center',
        'yanchor': 'top'
    }
)

fig.show()

 

선형 회귀선 추가하기

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm', trendline='ols',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)'}, 
                 width=700, height=500, template='plotly_white')

 

회귀선 스타일 변경

fig = px.scatter(data_frame=penguins, x='bill_length_mm', y='bill_depth_mm', trendline='ols',
                 labels={'bill_length_mm': '부리 길이(mm)', 'bill_depth_mm': '부리 깊이(mm)'}, 
                 width=700, height=500, template='plotly_white')
                 
fig.update_traces(marker=dict(color='#F8766D', size=8),line=dict(color='#FA9890', width=3))

 

범례가 사용된 경우, 범례에 따라 별도로 회귀선이 그려지게 된다.👇

 

예시 1

 

예시 2

 


4. 히스토그램

기본 히스토그램

fig = px.histogram(data_frame=animals_weight, x='체중(kg)', 
                   color_discrete_sequence=px.colors.qualitative.Set2, 
                   title='히스토그램', width=600, height=500)
fig.show()

 

히스토그램- 스타일 커스터마이징

fig = px.histogram(data_frame=animals_weight, x='체중(kg)', color_discrete_sequence=px.colors.qualitative.Set2, 
                   template='plotly_white', width=600, height=500)
fig.update_traces(marker=dict(line=dict(color='gray', width=1))) # 막대기에 윤곽선 추가

fig.update_layout(
    title={
        'text': '히스토그램',
        'y': 0.90, 
        'x': 0.5, 
        'xanchor': 'center',
        'yanchor': 'top'
    },
    yaxis_title='유기동물 수'
)

fig.show()

 


5. 박스 플롯(상자 수염 차트, 상자 그림)

기본 박스 플롯

fig = px.box(data_frame=data, x='체중(kg)', title='유기동물 몸무게 박스 플롯', width=700, height=500)
fig.show()

 

박스 플롯- 스타일 커스터마이징

fig = px.box(data_frame=data, x='체중(kg)', color_discrete_sequence=px.colors.qualitative.Set2, 
                   template='plotly_white', width=600, height=500)
                   
fig.update_layout(
    title={
        'text': '유기동물 몸무게 박스 플롯',
        'y': 0.90,  
        'x': 0.5, 
        'xanchor': 'center',
        'yanchor': 'top'
    }
)

fig.show()

 

범례 적용

fig = px.box(data_frame=data, x='체중(kg)', y= '동물종류',
             color_discrete_sequence=px.colors.qualitative.Set2, 
             template='plotly_white', width=600, height=500)

 

data['성별'] = data['성별'].replace({'F': '암컷', 'M': '수컷', 'Q': '알 수 없음'})

fig = px.box(data_frame=data, x='체중(kg)', y= '동물종류', color= '성별',
            color_discrete_sequence=px.colors.qualitative.Set2, 
            template='plotly_white', width=600, height=500)

 


6. 파이 차트

기본 파이 차트

fig = px.pie(data_frame=age, names='나이', values='비율', title='유기동물 나이별 비율')
fig.show()

 

파이 차트- 스타일 커스터마이징

※ plotly.express 모듈에서 그래프의 스타일을 지정할 수 있는 옵션들은 제공하지 않는다,

※ 세부 설정은 plotly.graph_objects의 go.Figure를 통해 가능하다.

 

import plotly.graph_objects as go

fig = go.Figure(data=[go.Pie(
    labels=age['나이'],
    values=age['비율'],
    hole=0.3,  # 구멍 크기 설정
    marker=dict(
        colors=px.colors.sequential.amp,  # 그래프 팔레트 설정
        line=dict(color='white', width=1.5)  # 윤곽선 색, 굵기 설정
    ),
    textfont=dict(size=13.5)  # 글차 크기 설정
)])

fig.update_layout(
    title={
        'text': '유기동물 나이별 비율',
        'y': 0.87,  # 제목의 y축 위치 (0.0 ~ 1.0)
        'x': 0.5,  # 제목의 x축 위치 (0.0 ~ 1.0),
        'font': dict(size=18, family='Arial', color='black'), # 제목 글자 크기 및 폰트, 색상 설정
        'xanchor': 'center',
        'yanchor': 'top'
    },
    paper_bgcolor='#EBE6E1',  # 외부 배경색 설정
    legend_title_text='나이'  # 범례 제목 설정
)

fig.show()

 


7. 히트맵

히트맵으로 상관계수 그래프를 그려보자.

데이터는 타이타닉 탑승자 데이터를 활용했다.

펭귄데이터와 마찬가지로 seaborn을 통해 바로 데이터를 가져올 수 있다.

import seaborn as sns

titanic = sns.load_dataset('titanic')
titanic = titanic[['survived','pclass','age','sibsp','fare']].corr()

 

기본 히트맵

fig = px.imshow(titanic, title = '타이타닉 생존자 상관계수 그래프', width=700, height=500)
fig.show()

 

히트맵- 스타일 커스터마이징

fig = px.imshow(titanic, text_auto='.2f', color_continuous_scale='Teal', width=700, height=500)

fig.update_layout(
    title={
        'text': '타이타닉 생존자 상관계수 그래프',
        'y': 0.93,  
        'x': 0.48, 
        'xanchor': 'center',
        'yanchor': 'top'
    }
)

fig.show()

 

 


 

728x90
반응형