著者:飯尾 淳
本連載では「Pythonを昔から使っているものの、それほど使いこなしてはいない」という筆者が、いろいろな日常業務をPythonで処理することで、立派な「蛇使い」に育つことを目指します。その過程を温かく見守ってください。皆さんと共に勉強していきましょう。第28回では、インタラクティブなグラフを手軽に作成できる可視化ライブラリ「Plotly」を使って、さまざまなグラフを作成します。
シェルスクリプトマガジン Vol.98は以下のリンク先でご購入できます。
図2 散布図を描くコード
1 2 3 4 |
fig = px.scatter(df, x='sepal_width', y='sepal_length', color='species', size='petal_length') fig.update_layout(width=800, height=600) fig.show() |
図5 花弁の長さのデータを表示できるようにしたコード
1 2 3 4 5 |
fig = px.scatter(df, x='sepal_width', y='sepal_length', color='species', size='petal_length', hover_data=['petal_width']) fig.update_layout(width=800, height=600) fig.show() |
図7 がくの幅の分布をヒストグラムで表示するコード
1 2 3 |
fig = px.histogram(df, x='sepal_width', color='species') fig.update_layout(width=800, height=600) fig.show() |
図11 カラースキームを変更するコードの例
1 2 3 4 |
# 離散的なデータ向けのカラースキーム設定 px.defaults.color_discrete_sequence = px.colors.qualitative.T10 # 連続的なデータ向けのカラースキーム設定 px.defaults.color_continuous_scale = px.colors.sequential.GnBu |
図13 四つのヒストグラムをまとめて表示するコードの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from plotly.subplots import make_subplots fig = make_subplots(rows=2, cols=2, shared_yaxes=True) figs = [px.histogram(df, x='sepal_width', color='species', barmode='overlay'), px.histogram(df, x='sepal_length', color='species', barmode='overlay'), px.histogram(df, x='petal_width', color='species', barmode='overlay'), px.histogram(df, x='petal_length', color='species', barmode='overlay')] i = 0 for f in figs: for g in f.data: fig.add_trace(g, row=(i//2)+1, col=(i%2)+1) i += 1 fig.update_layout(height=600, width=800, title_text='4種類のヒストグラム', barmode='overlay', xaxis_title=‘sepal_width', xaxis2_title='sepal_length', xaxis3_title='petal_width', xaxis4_title='petal_length') fig.show() |
図15 図13のコードの改良版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from plotly import graph_objects as go from plotly.subplots import make_subplots fig = make_subplots(rows=2, cols=2, shared_yaxes=True) i = 0 for types in ['sepal_width', 'sepal_length', 'petal_width', 'petal_length']: for species, g in df.groupby('species'): fig.add_trace(go.Histogram(x=g[types], name=f'{species} ({types})', opacity=0.7), row=(i//2)+1, col=(i%2)+1) i += 1 fig.update_layout(height=600, width=800, title_text='4種類のヒストグラム', barmode='overlay', xaxis_title=‘sepal_width', xaxis2_title='sepal_length', xaxis3_title='petal_width', xaxis4_title='petal_length') fig.show() |
図17 tipsデータセットを読み込んで散布図を描くコード
1 2 3 4 5 6 |
df = px.data.tips() fig = px.scatter(df, x='total_bill', y='tip', color='day', size='size', hover_data=['time', 'sex', 'smoker']) fig.update_layout(width=800, height=600) fig.show() |
図19 曜日ごとのチップの額を箱ひげ図で描くコード
1 2 3 4 5 |
fig = px.box(df, x='day', y='tip', color='day', category_orders={'day': ['Thur', 'Fri', 'Sat', 'Sun']}) fig.update_layout(width=800, height=600) fig.show() |
図21 二つの箱ひげ図を並べて描くコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
fig = make_subplots(rows=1, cols=2) figs = [px.box(df, x='day', y='tip', color='day', category_orders={'day': ['Thur', 'Fri', 'Sat', 'Sun']}), px.box(df, x='day', y='total_bill', color='day', category_orders={'day': ['Thur', 'Fri', 'Sat', 'Sun']})] i = 0 for f in figs: for g in f.data: fig.add_trace(g, row=1, col=(i % 2)+1) i += 1 fig.update_layout(width=800, height=600, title_text='tipsとtotal_billの比較', xaxis_title='tips', xaxis2_title='total_bill') |
図23 バイオリン図を描くコード
1 2 3 4 5 |
fig = px.violin(df, x='day', y='tip', color='day', category_orders={'day': ['Thur', 'Fri', 'Sat', 'Sun']}) fig.update_layout(width=800, height=600) fig.show() |
図24 ヒートマップを描くコード
1 2 3 4 5 6 7 8 |
fig = px.density_heatmap(df, x='day', y='time', z='tip', histfunc='avg', category_orders={'day': ['Thur', 'Fri', 'Sat', 'Sun'], 'time': ['Dinner', 'Lunch']}) fig.update_layout(width=800, height=400, title_text='曜日と時間帯のヒートマップ(tip)') fig.show() |