Python - Plotly를 이용해서 데이터 시각화하는 방법
github 주소 : github.com/sangHa0411/DataScience/blob/main/Amazon_BestSellers_Plotly.ipynb
sangHa0411/DataScience
Contribute to sangHa0411/DataScience development by creating an account on GitHub.
github.com
이번 포스팅에서는 matplotlib , seaborn 과 더불어서 많이 사용되는 plotly 라이브러리를 활용해서 데이터 시각화하는 방법에 대해서 정리해보겠습니다.
plotly 라이브러리가 가지는 장점은 interacitve , 즉 상호작용이 가능하다라는 것인데 정리하면서 이러한 점을 확인해보겠습니다.
먼저 Pandas를 이용해서 데이터를 불러오겠습니다.
그리고 plotly를 이용하기 위해서 핵심 라이브러리를 불러오겠습니다.
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objs as go
1 . 원 그래프
fig = px.pie(df ,
names = 'Genre' ,
hover_data = ['User Rating'] ,
title = 'Genre Distribution Rate')
fig.update_traces(textposition='inside',
textinfo='percent+label')
fig.show()
df로 pandas Dataframe 을 입력하고 names 인자로 데이터의 속성을 기입해서 원그래프로 만듭니다.
fig.update_trace 함수를 이용해서 원그래프에서 제목과 비율을 내부에 표기하도록 설정하였습니다.
fig = px.sunburst(df, path=['Genre', 'Year', ],
values='Reviews')
fig.update_layout(title = 'Sunburst Graph')
fig.show()
plotly의 sunburst 함수를 이용해서 다중 레벨의 원 그래프를 그릴 수 있는데 이러한 속성을 path 인자로 입력합니다.
그리고 이 부분에 대한 원 그래프의 크기를 데이터의 Values 속성으로 정하도록 합니다.
그리고 위 그림에서 확인 할 수 있듯이 마우스 커서를 대면 그에 대한 정보를 확인할 수 있습니다.
values 를 Reviews로 정하였으므로 해당 부분의 Reviews가 얼마나 되는지 확인할 수 있습니다.
2. 막대 그래프
year_group = df.groupby('Year').sum()['Reviews']
keys = year_group.index
values = list(year_group)
fig = go.Figure()
data = go.Bar(x = keys ,
y = values)
fig.add_trace(data)
fig.update_layout(title_text = ' Year Reviews Sum Bar Graph' ,
xaxis_title = 'Year' ,
yaxis_title = 'Reviews(Sum)')
fig.show()
원그래프에서는 px.pie를 이용해서 그래프를 그렸지만 이번에는 다른 함수인 import plotly.graph_objs as go 를 이용해서 시각화해보겠습니다.
먼저 go.Figure() 를 먼저 선언합니다, 그리고 go.Bar() 함수로 내부 막대그래프를 만들고 이를 go.Figure() 에 넣어서 막대그래프를 화면합니다.
그리고 이 방법으로는 화면의 x축 , y축 그리고 제목을 fig.update_layout 함수를 이용해서 정해주어야 합니다.
fig = px.bar(df ,
x = 'Year' ,
y = 'Reviews',
title = 'Year Reviews Bar Graph')
fig.show()
그리고 앞서서 한 방법으로 px.bar 함수를 이용해서도 막대그래프를 그려줄 수 있는데 여기서 y = 'Reviews' 함수를 이용하면 각 속성의 Reviews 속성의 값을 다 쌓아서 만든 것을 확인할 수 있습니다.
3. 선 그래프
year_group = df.groupby('Year').mean()['Reviews']
keys = year_group.index
values = list(year_group)
fig = go.Figure()
data = go.Scatter(x = keys ,
y = values ,
line = dict(color = 'firebrick' , width = 3))
fig.add_trace(data)
fig.update_layout(title = 'Year Reviews Mean Line Graph' ,
xaxis_title = 'Year' ,
yaxis_title = 'Reviews(Mean)')
fig.show()
선 그래프를 만드는데 go.Scatter 함수를 이용하며 마지막에 line = dict(color = , width = ) 를 함수에 입력함으로써 선 그래프로 만들어 줄 수 있습니다. color 로 선 그래프의 색상을 정해줄 수 있고 width로 선의 크기를 정해줄 수 있습니다.
4. 점 그래프
fig = px.scatter(df ,
x = 'Price' ,
y = 'Reviews' ,
color = 'Genre' ,
hover_data = ['Name'] ,
title = 'Price Reviews Scatter Plot' ,
size = 'User Rating')
fig.show()
앞서서는 Scatter함수를 이용해서 선그래프를 그렸지만 이번에는 점 그래프를 그려보았습니다. 주의할 것은 선 그래프를 그릴 때는 x 이산적인 속성의 값을 y에는 그 속성에 대한 수치 값을 입력해주었는데
위 와 같은 경우에는 x , y , 모두 연속적인 속성의 이름을 기입해줍니다. 그리고 color 속성으로 데이터를 구분지어서 시각화해볼 수 있습니다.
그리고 hover_data 속성으로 해당 점에 대한 정보를 보여줄 때 어떤 정보를 보여줄 지를 정할 수 있습니다.
위에서 확인할 수 있듯이 해장 점에 마우스 커서를 위치하였을 때 Name에 대한 정보가 보여지는 것을 확인할 수 있습니다.
fig = go.Figure()
year_group = fiction_df.groupby('Year').mean()['Reviews']
x1 = year_group.index
y1 = list(year_group)
fiction_data = go.Scatter(x = x1, y = y1,
marker = dict(color = 'tomato' , size = 12) ,
mode = 'markers' ,
name = 'Fiction')
fig.add_trace(fiction_data)
year_group = nonfiction_df.groupby('Year').mean()['Reviews']
x2 = year_group.index
y2 = list(year_group)
nonfiction_data = go.Scatter(x = x2, y = y2,
marker = dict(color = 'lightblue' , size = 12) ,
mode = 'markers' ,
name = 'Non Fiction')
fig.add_trace(nonfiction_data)
fig.update_layout(title = 'Year Review Scatter Plot',
xaxis_title = 'Year',
yaxis_title = 'Reviews (mean)')
fig.show()
이번에는 px.scatter 함수가 아니라 go.Scatter 함수를 이용해서 그래프를 그려보았습니다. 앞서 말씀드린대로 go.Figure 함수를 만들고 그리고 점 그래프를 go.Scatter 함수로 만들어 줍니다. 이번에는 Fiction , Non Fiction 따로따로 만들어서 같은 go.Figure 에 입력하였습니다.
선 그래프를 만들 때는 아래에서 확인 할 수 있듯이 line = dict 를 입력하였지만 점 그래프를 만들 때는 marker = dict 인자로 입력해주는 것을 확인할 수 있습니다.
# 선 그래프
data = go.Scatter(x = keys ,
y = values ,
line = dict(color = 'firebrick' , width = 3))
# 점 그래프
nonfiction_data = go.Scatter(x = x2, y = y2,
marker = dict(color = 'lightblue' , size = 12) ,
mode = 'markers' ,
name = 'Non Fiction')
참고자료 : plotly.com/python/basic-charts/
Basic Charts
Plotly's Python graphing library makes interactive, publication-quality graphs online. Examples of how to make basic charts.
plotly.com