본문 바로가기

카테고리 없음

파이썬 Plotly 막대 그래프 그리기 (Bar charts)

Plotly 라이브러리를 사용해서 막대그래프를 그리는 방법을 알아보겠습니다. 이번 포스팅에서는 총 세 가지 타입의 막대그래프를 다루겠습니다.

 

1. 하나의 세로 막대그래프

2. 여러 개의 세로 막대그래프

3. 누적 세로 막대그래프

 

사용할 데이터는 Plotly 라이브러리에 내장되어있는 "요일별(목금토일) 성별 매출과 팁 금액 데이터"입니다. 이 데이터를 불러와서 데이터프레임의 형태로 사용하겠습니다. 불러오는 코드는 다음과 같습니다.

 

# 라이브러리 불러오기
import plotly.express as px
import pandas as pd

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

df.head()

"""
	total_bill	tip	sex	smoker	day	time	size
0	16.99	1.01	Female	No	Sun	Dinner	2
1	10.34	1.66	Male	No	Sun	Dinner	3
2	21.01	3.50	Male	No	Sun	Dinner	3
3	23.68	3.31	Male	No	Sun	Dinner	2
4	24.59	3.61	Female	No	Sun	Dinner	4
"""

 

하나의 세로 막대그래프 

요일별 매출 금액의 합계를 나타내는 막대그래프를 그리겠습니다. Plotly 라이브러리를 불러온 다음 그래프를 만듭니다. 

 

# plotly 라이브러리 불러오기
import plotly.offline as pyo
import plotly.graph_objs as go

# 막대 그래프 그리기
trace1 = go.Bar(x=df['day'], y=df['total_bill'])
data = [trace1]
layout = go.Layout(title='요일별 매출액')
fig = go.Figure(data=data, layout=layout)
pyo.iplot(fig)

 

 

여러 데이터 행이 동일한 기준(여기서는 요일)으로 사각형 형태로 누적되어 쌓인 것을 볼 수 있습니다. eda 과정에서는 이런 형태의 그래프 작성이 효율적이겠지만, 최종 출력물로 쓰기에는 조금 무리가 있는 것 같습니다. 사각형 하나로 그리고 싶다면 아래 코드와 같은 pandas를 이용한 데이터 전처리가 필요합니다.

 

# grouby 적용
df1 = df.groupby(by='day').sum().reset_index()

trace2 = go.Bar(x=df1['day'], y=df1['total_bill'],)
data = [trace2]
layout = go.Layout(title='요일별 매출액')
fig = go.Figure(data=data, layout=layout)
pyo.iplot(fig)

 

 

여러 개의 세로 막대그래프 

pandas groupby 메서드를 이용해서 전처리를 한 다음 그래프를 그리겠습니다.

# grouby 적용
df2 = df.groupby(by=['day', 'sex']).sum().reset_index()

trace3 = go.Bar(x=df2[df2['sex'] == 'Female'].day, y=df2[df2['sex'] == 'Female'].total_bill, name='Female')
trace4 = go.Bar(x=df2[df2['sex'] == 'Male'].day, y=df2[df2['sex'] == 'Male'].total_bill, name='Male')

data = [trace3, trace4]
layout = go.Layout(title='요일별 매출액')
fig = go.Figure(data=data, layout=layout)
pyo.iplot(fig)

 

 

누적 세로 막대그래프 

누적 막대그래프를 그리기 위해서는 layout에 barmode=stack를 추가하면 됩니다.

# grouby 적용
df2 = df.groupby(by=['day', 'sex']).sum().reset_index()

trace3 = go.Bar(x=df2[df2['sex'] == 'Female'].day, y=df2[df2['sex'] == 'Female'].total_bill, name='Female')
trace4 = go.Bar(x=df2[df2['sex'] == 'Male'].day, y=df2[df2['sex'] == 'Male'].total_bill, name='Male')

data = [trace3, trace4]

layout = go.Layout(title='요일별 매출액', barmode='stack')

fig = go.Figure(data=data, layout=layout)
pyo.iplot(fig)

 

 

 

- 이 글은 아나콘다(Anaconda3)가 설치된  주피터 노트북에서 작성되었습니다.