Python

Python - Plotly를 이용해서 데이터 시각화하는 방법

electronicprogrammer 2020. 11. 6. 22:41

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