棒グラフ
Contents
1. 棒グラフ#
1.1. 概要#
棒グラフ(Bar Chart) とは,主に質的変数を対象にして,棒の長さで数量を表すグラフです.棒を縦方向に並べることもありますし,横方向に並べることもあります.質的変数の量を見る最も一般的な方法の一つです.
例えば上図は,作品ごとの合計掲載週数を表した棒グラフです. なお,棒グラフにはいくつか種類がありますが,このページでは積上げ棒グラフと集合棒グラフについて紹介します.
集合棒グラフ(Grouped Bar Chart) とは,下図のように変数の値に応じてグループ化し, 横に 並べた棒グラフです.
積上げ棒グラフ(Stacked Bar Chart) とは,下図のように変数の値に応じてグループ化し, 縦に 積み上げた棒グラフです.
1.2. Plotlyによる作図方法#
Plotlyではplotly.express.bar()
で棒グラフを作成可能です.
import plotly.express as px
fig = px.bar(df, x='col_x', y='col_y')
上記の例では,df
のcol_x
列を横軸,col_y
列を縦軸とした棒グラフのオブジェクトfig
を作成します.また,
import plotly.express as px
fig = px.bar(
df, x='col_x', y='col_y',
color='col_group', barmode='group')
上記のようにbarmode='group'
を指定することでcol_group
でグループ化可能です.さらに,
import plotly.express as px
fig = px.bar(
df, x='col_x', y='col_y',
color='col_group', barmode='stack')
上記のようにbarmode='stack'
を指定することでcol_group
で積み上げた棒グラフを作成可能です.
1.3. MADB Labを用いた作図例#
1.3.1. 下準備#
import itertools
import pandas as pd
import plotly.express as px
import warnings
warnings.filterwarnings('ignore')
# 前処理の結果,以下に分析対象ファイルが格納されていることを想定
PATH_DATA = '../../data/preprocess/out/episodes.csv'
# Jupyter Book用のPlotlyのrenderer
RENDERER = 'plotly_mimetype+notebook'
def show_fig(fig):
"""Jupyter Bookでも表示可能なようRendererを指定"""
fig.update_layout(margin=dict(t=50, l=25, r=25, b=25))
fig.show(renderer=RENDERER)
def add_years_to_df(df, unit_years=10):
"""unit_years単位で区切ったyears列を追加"""
df_new = df.copy()
df_new['years'] = \
pd.to_datetime(df['datePublished']).dt.year \
// unit_years * unit_years
df_new['years'] = df_new['years'].astype(str)
return df_new
def resample_df_by_cname_and_years(df):
"""cnameとyearsのすべての組み合わせが存在するように0埋め
この処理を実施しないと作図時にX軸方向の順序が変わってしまう"""
df_new = df.copy()
yearss = df['years'].unique()
cnames = df['cname'].unique()
for cname, years in itertools.product(cnames, yearss):
df_tmp = df_new[
(df_new['cname'] == cname)&\
(df_new['years'] == years)]
if df_tmp.shape[0] == 0:
s = pd.Series(
{'cname': cname,
'years': years,
'weeks': 0,},
index=df_tmp.columns)
df_new = df_new.append(
s, ignore_index=True)
return df_new
def resample_df_by_creator_and_years(df):
"""creatorとyearsのすべての組み合わせが存在するように0埋め
この処理を実施しないと作図時にX軸方向の順序が変わってしまう"""
df_new = df.copy()
yearss = df['years'].unique()
creators = df['creator'].unique()
for creator, years in itertools.product(creators, yearss):
df_tmp = df_new[
(df_new['creator'] == creator)&\
(df_new['years'] == years)]
if df_tmp.shape[0] == 0:
s = pd.Series(
{'creator': creator,
'years': years,
'weeks': 0,},
index=df_tmp.columns)
df_new = df_new.append(
s, ignore_index=True)
return df_new
df = pd.read_csv(PATH_DATA)
1.3.2. 作品別の掲載週数(上位20作品)#
まずは,作品ごとの掲載週数を見てみましょう.
df_plot = df.value_counts('cname').reset_index(name='weeks').head(20)
fig = px.bar(df_plot, x='cname', y='weeks',
title='作品別の掲載週数')
fig.update_xaxes(title='作品名')
fig.update_yaxes(title='掲載週数')
show_fig(fig)