Violin Plot(바이올린 플롯)은 Box Plot과 동일하게 일변량, 연속형 데이터의 분포를 설명하기 위해 사용되는 그래프 입니. 데이터의 통계적 의미를 표현할때 자주 사용되는 매우 유용한 차트입니다.
지금부터 plotly를 활용해서 Violin plot 를 그리는 방법에 대해 알아보겠습니다.
# 직접 입력 px.violin(y=[데이터]) # 데이터셋을 활용한 입력 px.violin(data_frame= df, y="total_bill")[사용 함수]
px.violin()
[함수 input 내용]
데이터 직접 입력
y = y값 리스트
데이터셋을 활용한 입력
data_frame = pandas 데이터 프레임
y = y값 컬럼 명
import plotly.express as px # 데이터 생성 import numpy as np np.random.seed(1) y0 = np.random.randn(50) - 1 fig = px.violin(y=y0) fig.show()
import plotly.express as px # 데이터 불러오기 df = px.data.tips() fig = px.violin(df, y="total_bill") fig.show()
fig.add_trace(go.Violin(y=[데이터]))fig.add_trace() : Trace를 추가할때 사용
go.Violin() : fig.add_trace() 안에 넣은 Violin Trace[함수 input 내용]
y = y값 리스트
import plotly.graph_objects as go # 데이터 생성 import numpy as np np.random.seed(1) y0 = np.random.randn(50) - 1 y1 = np.random.randn(50) + 1 # Figure 생성 fig = go.Figure() # Scatter Trace 추가 fig.add_trace(go.Violin(y=y0)) fig.add_trace(go.Violin(y=y1)) fig.show()
import plotly.express as px # 데이터 불러오기 df = px.data.tips() fig = px.violin(df, y="total_bill",points="all") fig.show()
point : 박스플롯과 함께 데이터 위치를 marker를 통해 표시하는 모드
all : 모든 포인트 같이 표현
outliers : outlier 밖의 포인트만 표현
suspectedoutliers : outlier 포인트를 다 표현하되 4Q3-3Q1< x <4Q1-3Q3 의 값만 하이라트로 표시
False : 표시 X
import plotly.express as px # 데이터 불러오기 df = px.data.tips() fig = px.violin(df, x="day", y="total_bill", color="smoker") fig.show()
색으로 구분하고 싶은 데이터 컬럼명을 "color= " 로 지정합니다.
만약 두개로 나뉜 violin Plot을 겹쳐서 그리고 싶으면
import plotly.express as px # 데이터 불러오기 df = px.data.tips() fig = px.violin(df, x="day", y="total_bill", color="smoker", violinmode= 'overlay') fig.show()
violinmode= 'overlay' 로 지정하면 겹쳐 그리기가 가능합니다.
graph_objects의 경우 fig.update_traces(violinmode='overlay') 로 지정합니다.
import plotly.express as px # 데이터 불러오기 df = px.data.tips() fig = px.violin(df, x="day", y="total_bill", color="smoker",box=True) fig.show()
"box= True" 로 지정합니다.
graph_objects의 경우 box_visible=True 로 지정합니다.
Violin Plot은 좌우 대칭형 그래프 이기 때문에 반쪽만으로도 의미 전달이 가능합니다. 반쪽만 표현하려면 아래 코드를 추가합니다.
fig.update_traces(side=왼쪽 or 오른쪽)[사용 함수]
fig.update_traces()
[함수 input 내용]
side = {"positive" , "negative"}
positive : 오른쪽만 생성
negative : 왼쪽만 생성
import plotly.express as px # 데이터 불러오기 df = px.data.tips() fig = px.violin(df, x="day", y="total_bill") fig.update_traces(side='positive') fig.show()
import plotly.graph_objects as go import pandas as pd #데이터 불러오기 df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/violin_data.csv") # Figure 생성 fig = go.Figure() #왼쪽 그래프 생성 fig.add_trace(go.Violin(x=df['day'][ df['smoker'] == 'Yes' ], y=df['total_bill'][ df['smoker'] == 'Yes' ], legendgroup='Yes', scalegroup='Yes', name='Yes', side='negative', line_color='blue') ) #오른쪽 그래프 생성 fig.add_trace(go.Violin(x=df['day'][ df['smoker'] == 'No' ], y=df['total_bill'][ df['smoker'] == 'No' ], legendgroup='No', scalegroup='No', name='No', side='positive', line_color='orange') ) fig.update_traces(meanline_visible=True) fig.update_layout(violingap=0, violinmode='overlay') fig.show()
graph_objects 를 활용해서 2개의 Violin 그래프를 생성합니다.
이때 하나는 side='negative' 즉 왼쪽만 생성 다른하나는 side='positive' 오른쪽만 생성 합니다.
마지막으로 fig.update_layout(violinmode='overlay') 를 통해 겹쳐 그리기 설정을 합니다.
import plotly.express as px # 데이터 불러오기 df = px.data.tips() fig = px.violin(df, x="total_bill") fig.show()
input 을 y 가 아닌 x에 하면 가로로 생성됩니다
fig.update_traces(marker_color= 마커 색, marker_size= 마커 크기, marker_line_width=마커 테두리 두깨, marker_line_color=마커 테두리 색, marker_symbol = 마커 모양, marker_opacity = 마커 투명도, line_color = violin 라인색, line_width = violin 라인 두깨, fillcolor = violin 내부 색, opacity = violin 투명도 )[사용 함수]
fig.update_traces()
[함수 input 내용]
marker_color= 마커 색
marker_size=마커 크기
marker_line_width=마커 테두리 두깨
marker_line_color=마커 테두리 색
marker_symbol = 마커 모양
marker_opacity = 마커 투명도
line_color = violin 라인색
line_width = violin 라인 두깨
fillcolor = violin 내부 색
opacity = violin 투명도
import plotly.express as px # 데이터 불러오기 df = px.data.tips() # Box Plot 생성 fig = px.box(df, y="total_bill", points ="all" ) #Box Plot 변경 fig.update_traces(marker_color= "green",marker_size = 5, line_width= 2, line_color="blue",fillcolor= 'red', opacity=0.5) fig.show()