STEP 19:インタラクティブなグラフの作成

🎮 STEP 19: インタラクティブなグラフの作成

ホバー、ズーム、データ切替など、動的な機能を持つグラフをマスターしよう!

📋 このステップで学ぶこと

  • ホバーツールチップのカスタマイズ
  • ズーム・パン機能の活用
  • 凡例による表示/非表示の切替
  • ボタンによるデータの切替
  • スライダーによる時系列データの操作
  • 実践的なインタラクティブダッシュボード

🎯 1. インタラクティブ機能の概要

インタラクティブとは

インタラクティブ(対話型)なグラフとは、ユーザーがマウスやタッチ操作でグラフと対話できるグラフのことです。静的なグラフ(画像)とは異なり、ホバーで詳細情報を見たり、ズームで拡大したり、表示するデータを切り替えたりできます。

Plotlyのグラフには、多くのインタラクティブ機能がデフォルトで組み込まれています。特別なコードを書かなくても、作成したグラフはすぐに対話的に操作できます。

💡 身近な例で考えてみよう

インタラクティブなグラフは、Google Mapsのようなものです。

静的なグラフ(従来):紙の地図 → 拡大できない、詳細が見えない

インタラクティブなグラフ(Plotly):Google Maps → ズーム、パン、場所をクリックして詳細表示

✨ Plotlyで自動的に使える機能
機能 操作方法 できること
ホバー マウスを乗せる データポイントの詳細値を表示
ズームイン マウスホイール上 / 範囲をドラッグ グラフの一部を拡大
ズームアウト マウスホイール下 グラフを縮小して全体を表示
パン ドラッグ(パンモード時) 表示範囲を移動
凡例クリック 凡例をシングル/ダブルクリック データ系列の表示/非表示を切替
ツールバー グラフ右上のアイコン リセット、ダウンロード、選択ツールなど
【インタラクティブ機能の操作方法まとめ】 🖱️ ホバー : マウスをデータポイントに乗せる 🔍 ズームイン : マウスホイールを上に回す / ドラッグで範囲選択 🔍 ズームアウト : マウスホイールを下に回す 👆 パン : ドラッグで視点を移動(パンモード選択時) 🔄 リセット : ツールバーの「Reset axes」をクリック 💾 画像保存 : ツールバーの「Download plot as png」をクリック 👁️ 表示切替 : 凡例をクリック 【凡例クリックの詳細】 ・シングルクリック: その系列のみ表示/非表示を切替 ・ダブルクリック: その系列のみ表示(他をすべて非表示) ・もう一度ダブルクリック: すべての系列を表示に戻す

💬 2. ホバーツールチップのカスタマイズ

ホバーツールチップとは

ホバーツールチップとは、マウスをデータポイントに乗せたときに表示される情報ボックスのことです。デフォルトではX値とY値が表示されますが、カスタマイズして追加情報を表示することができます。

適切にカスタマイズされたホバーツールチップは、ユーザーがグラフを探索する際に非常に役立ちます。グラフを複雑にすることなく、詳細情報を提供できます。

基本的なホバー表示

まずは、デフォルトのホバー表示を確認しましょう。

# 基本的なホバー表示(デフォルト) import plotly.express as px # tipsデータを読み込み tips = px.data.tips() # 基本的な散布図を作成 fig = px.scatter( tips, x=’total_bill’, y=’tip’, title=’会計額とチップ(基本ホバー)’ ) fig.show()

ホバー情報を追加する

hover_data引数を使うと、ホバー時に表示する情報を追加できます。X値とY値以外の列も表示できるようになります。

# ホバー情報を追加した散布図 import plotly.express as px tips = px.data.tips() fig = px.scatter( tips, x=’total_bill’, y=’tip’, color=’day’, # 曜日で色分け size=’size’, # 人数でサイズ変更 hover_data={ ‘total_bill’: ‘:.2f’, # 小数点2桁で表示 ‘tip’: ‘:.2f’, # 小数点2桁で表示 ‘day’: True, # 曜日を表示 ‘time’: True, # 時間帯を追加 ‘size’: True # 人数を追加 }, title=’カスタマイズされたホバー情報’ ) fig.show()
📝 hover_data の書き方
書き方 意味
'列名': True その列をホバーに追加表示 'time': True
'列名': False その列をホバーから除外 'total_bill': False
'列名': ':.2f' 表示形式を指定(小数点2桁) 'tip': ':.2f'
'列名': ':,.0f' カンマ区切り、小数なし 'sales': ':,.0f'

完全カスタムのホバーテンプレート

より細かくホバー表示をカスタマイズしたい場合は、hovertemplateを使います。HTMLのような書き方で、表示内容を完全にコントロールできます。

以下のコードで、完全にカスタマイズされたホバーを作成します。

# 完全カスタムのホバーテンプレート import plotly.graph_objects as go import pandas as pd # サンプルデータを作成 data = pd.DataFrame({ ‘商品’: [‘A商品’, ‘B商品’, ‘C商品’, ‘D商品’, ‘E商品’], ‘売上’: [100, 120, 80, 150, 90], ‘利益’: [20, 25, 15, 35, 18], ‘在庫’: [50, 30, 80, 20, 45] }) fig = go.Figure() # 棒グラフを追加 fig.add_trace(go.Bar( x=data[‘商品’], y=data[‘売上’], customdata=data[[‘利益’, ‘在庫’]], # 追加データを設定 hovertemplate=’%{x}
‘ + ‘売上: %{y}万円
‘ + ‘利益: %{customdata[0]}万円
‘ + ‘在庫: %{customdata[1]}個
‘ + ‘‘ # 右側のボックスを非表示 )) fig.update_layout( title=’商品別売上(詳細ホバー付き)’, xaxis_title=’商品’, yaxis_title=’売上(万円)’ ) fig.show()

コードの解説

📝 hovertemplate の書き方
記法 意味 表示例
%{x} X軸の値 A商品
%{y} Y軸の値 100
%{y:.2f} Y軸の値(小数点2桁) 100.00
%{customdata[0]} 追加データの1番目 20(利益)
<b>...</b> 太字にする A商品
<br> 改行 (次の行へ)
<extra></extra> 右側のボックスを非表示 (trace 0 が消える)
💡 customdata の仕組み

customdataは、グラフに表示しないがホバー時に参照したいデータを渡すための引数です。

使い方の流れ:

1. customdata=data[['利益', '在庫']] で追加データを設定
2. %{customdata[0]} で1列目(利益)を参照
3. %{customdata[1]} で2列目(在庫)を参照

🔍 3. ズーム・パン機能の制御

ズームとパンとは

ズームは、グラフの一部を拡大・縮小する機能です。パンは、ズームした状態で表示範囲を移動する機能です。

Plotlyではこれらの機能がデフォルトで有効ですが、表示範囲を制限したり、操作モードを変更したりすることもできます。

ズーム範囲を制限する

データの意味がある範囲だけを表示したい場合、ズーム範囲を制限できます。例えば、売上データで負の値を見せたくない場合などに有効です。

# ズーム範囲を制限したグラフ import plotly.express as px import numpy as np # サンプルデータを生成 np.random.seed(42) x = np.linspace(0, 100, 200) y = np.sin(x/10) + np.random.normal(0, 0.1, 200) df = {‘x’: x, ‘y’: y} fig = px.line(df, x=’x’, y=’y’, title=’ズーム範囲を制限したグラフ’) # X軸の設定 fig.update_xaxes( range=[0, 100], # X軸の表示範囲を0〜100に制限 rangeslider_visible=False # レンジスライダーを非表示 ) # Y軸の設定 fig.update_yaxes( range=[-2, 2] # Y軸の表示範囲を-2〜2に制限 ) fig.show()

操作モードを設定する

ドラッグ操作のデフォルト動作を変更できます。例えば、ズームではなくパン(移動)をデフォルトにしたい場合などに使います。

# 操作モードを設定 import plotly.express as px tips = px.data.tips() fig = px.scatter( tips, x=’total_bill’, y=’tip’, title=’操作モード設定’ ) # ドラッグ操作とホバー動作の設定 fig.update_layout( dragmode=’zoom’, # ドラッグ時の動作を設定 hovermode=’closest’ # ホバー時の動作を設定 ) fig.show()
📝 dragmode と hovermode のオプション
パラメータ オプション 説明
dragmode 'zoom' ドラッグで範囲選択してズーム
'pan' ドラッグで表示範囲を移動
'select' 四角形でデータポイントを選択
'lasso' 自由な形でデータポイントを選択
False ドラッグ操作を無効化
hovermode 'closest' 最も近いデータポイントを表示
'x' 同じX値のすべてのポイントを表示
'x unified' X値に合わせて1つのボックスで表示
False ホバーを無効化

レンジスライダーを追加する

レンジスライダーは、グラフの下に表示される小さなプレビューで、表示範囲を簡単に変更できます。時系列データで特に便利です。

# レンジスライダー付きのグラフ import plotly.express as px # 株価データを読み込み stocks = px.data.stocks() fig = px.line( stocks, x=’date’, y=[‘GOOG’, ‘AAPL’, ‘AMZN’], title=’株価推移(レンジスライダー付き)’ ) # レンジスライダーを追加 fig.update_xaxes( rangeslider_visible=True, # レンジスライダーを表示 rangeslider_thickness=0.05 # スライダーの高さ(0〜1) ) fig.show()
💡 レンジスライダーの使い方

レンジスライダーが表示されたら、以下の操作ができます:

範囲の変更:スライダーの両端をドラッグして、表示範囲を調整
範囲の移動:選択された部分をドラッグして、同じ幅で時期をずらす
リセット:ツールバーの「Reset axes」でリセット

👁️ 4. 凡例による表示/非表示切替

凡例クリックの機能

Plotlyのグラフでは、凡例をクリックするだけでデータ系列の表示/非表示を切り替えられます。複数のデータを比較する際に、特定の系列だけを見たい場合に便利です。

凡例の位置とスタイルをカスタマイズ

# 凡例のカスタマイズ import plotly.express as px tips = px.data.tips() fig = px.scatter( tips, x=’total_bill’, y=’tip’, color=’day’, title=’凡例のカスタマイズ例’ ) # 凡例の設定 fig.update_layout( legend=dict( title=’曜日’, # 凡例のタイトル orientation=’h’, # ‘v’(縦)または ‘h’(横) yanchor=’bottom’, # 縦方向の基準点 y=1.02, # 縦方向の位置 xanchor=’right’, # 横方向の基準点 x=1, # 横方向の位置 bgcolor=’rgba(255,255,255,0.8)’, # 背景色(半透明の白) bordercolor=’gray’, # 枠線の色 borderwidth=1 # 枠線の太さ ) ) fig.show()
📝 legend の主要パラメータ
パラメータ 説明 値の例
orientation 凡例の向き 'v'(縦)/ 'h'(横)
x, y 位置(0〜1、グラフ外も可) x=1, y=1.02
xanchor, yanchor 基準点 'left', 'right', 'center'
bgcolor 背景色 'rgba(255,255,255,0.8)'
bordercolor 枠線の色 'gray', '#333'

複数データ系列の切替

複数のデータ系列を持つグラフでは、凡例クリックで見たいデータだけを表示できます。

# 複数データ系列のグラフ import plotly.graph_objects as go # データを用意 months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’] data = { ‘売上’: [100, 120, 150, 130, 160, 180], ‘利益’: [20, 25, 35, 28, 38, 45], ‘費用’: [80, 95, 115, 102, 122, 135] } fig = go.Figure() # 各系列を追加 for name, values in data.items(): fig.add_trace(go.Scatter( x=months, y=values, mode=’lines+markers’, name=name, line=dict(width=3), marker=dict(size=10) )) fig.update_layout( title=’月別データ(凡例クリックで切替)’, xaxis_title=’月’, yaxis_title=’金額(万円)’, hovermode=’x unified’, # 同じX位置のデータをまとめて表示 legend=dict( title=’指標(クリックで表示/非表示)’, font=dict(size=12) ) ) fig.show()
💡 凡例の操作方法まとめ

Plotlyの凡例は、見るだけでなく操作するためのUIです。

シングルクリック:その系列のみ表示/非表示を切替

ダブルクリック:その系列のみ表示(他をすべて非表示)

もう一度ダブルクリック:すべての系列を表示に戻す

🔘 5. ボタンによるデータ切替

updatemenusとは

updatemenusは、グラフにボタンやドロップダウンメニューを追加するための機能です。ユーザーがボタンをクリックすると、表示するデータやグラフの設定を変更できます。

凡例クリックよりも明示的な操作で、「2023年のデータを見る」「2024年のデータを見る」といった切り替えができます。

ボタンを追加する

以下のコードで、年度を切り替えるボタンを追加します。コードが長いので、まずは構造を理解しましょう。

【ボタン追加の構造】 fig.update_layout( updatemenus=[ # ← メニューのリスト dict( type=’buttons’, # ← ボタン形式 buttons=[ # ← ボタンのリスト dict( args=[{‘visible’: [True, False]}], # ← クリック時の動作 label=’2023年’, # ← ボタンのラベル method=’update’ # ← 更新方法 ), # 他のボタン… ] ) ] ) 【ポイント】 ・visible: 各トレースの表示/非表示を制御 ・[True, False]: 1番目のトレースを表示、2番目を非表示 ・method=’update’: トレースとレイアウトの両方を更新

※ 横長のコードはスマートフォンでは横スクロールできます。

# ボタンでデータを切り替える import plotly.graph_objects as go # データを用意 months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’] sales_2023 = [100, 120, 150, 130, 160, 180] sales_2024 = [110, 140, 170, 160, 190, 220] fig = go.Figure() # 2023年のデータ(最初は表示) fig.add_trace(go.Scatter( x=months, y=sales_2023, mode=’lines+markers’, name=’2023年’, line=dict(color=’steelblue’, width=3), marker=dict(size=10), visible=True # 最初は表示 )) # 2024年のデータ(最初は非表示) fig.add_trace(go.Scatter( x=months, y=sales_2024, mode=’lines+markers’, name=’2024年’, line=dict(color=’coral’, width=3), marker=dict(size=10), visible=False # 最初は非表示 )) # ボタンを追加 fig.update_layout( updatemenus=[ dict( type=’buttons’, direction=’left’, buttons=list([ dict( args=[{‘visible’: [True, False]}], label=’2023年’, method=’update’ ), dict( args=[{‘visible’: [False, True]}], label=’2024年’, method=’update’ ), dict( args=[{‘visible’: [True, True]}], label=’両方表示’, method=’update’ ) ]), pad={‘r’: 10, ‘t’: 10}, showactive=True, x=0.11, xanchor=’left’, y=1.15, yanchor=’top’ ) ], title=’年度別売上(ボタンで切替)’, xaxis_title=’月’, yaxis_title=’売上(万円)’ ) fig.show()

コードの解説

📝 updatemenus の主要パラメータ
パラメータ 説明 値の例
type メニューの種類 'buttons' / 'dropdown'
direction ボタンの並び方向 'left', 'right', 'up', 'down'
showactive 選択中のボタンを強調 True / False
x, y メニューの位置 x=0.11, y=1.15
args クリック時に適用する設定 [{'visible': [True, False]}]
method 更新方法 'update', 'restyle', 'relayout'

ドロップダウンメニューを追加する

ボタンの代わりにドロップダウンメニューを使うこともできます。選択肢が多い場合は、ドロップダウンの方が省スペースです。

# ドロップダウンメニューでデータを切り替える import plotly.graph_objects as go months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’] sales = [100, 120, 150, 130, 160, 180] profit = [20, 25, 35, 28, 38, 45] cost = [80, 95, 115, 102, 122, 135] fig = go.Figure() # 売上(最初は表示) fig.add_trace(go.Bar( x=months, y=sales, name=’売上’, marker_color=’steelblue’, visible=True )) # 利益(最初は非表示) fig.add_trace(go.Bar( x=months, y=profit, name=’利益’, marker_color=’lightgreen’, visible=False )) # 費用(最初は非表示) fig.add_trace(go.Bar( x=months, y=cost, name=’費用’, marker_color=’coral’, visible=False )) # ドロップダウンメニューを追加 fig.update_layout( updatemenus=[ dict( buttons=list([ dict( args=[{‘visible’: [True, False, False]}, {‘title’: ‘月別売上’}], label=’売上’, method=’update’ ), dict( args=[{‘visible’: [False, True, False]}, {‘title’: ‘月別利益’}], label=’利益’, method=’update’ ), dict( args=[{‘visible’: [False, False, True]}, {‘title’: ‘月別費用’}], label=’費用’, method=’update’ ), dict( args=[{‘visible’: [True, True, True]}, {‘title’: ‘月別データ(全表示)’}], label=’すべて’, method=’update’ ) ]), direction=’down’, # ドロップダウン形式 pad={‘r’: 10, ‘t’: 10}, showactive=True, x=0.11, xanchor=’left’, y=1.15, yanchor=’top’ ) ], title=’月別売上’, xaxis_title=’月’, yaxis_title=’金額(万円)’ ) fig.show()
⚠️ ボタンがうまく動かないときの確認ポイント

1. visibleリストの要素数:トレース数と一致しているか確認。3つのトレースがあるなら、[True, False, False]のように3つの値が必要。

2. トレースの順番:add_trace()を呼んだ順番でインデックスが決まる。visibleリストもその順番に対応。

3. argsの形式:argsはリスト形式で指定。args=[{'visible': [...]}]のように角括弧で囲む。

🎚️ 6. スライダーによる時系列操作

スライダーとは

スライダーは、グラフの下に表示されるバーで、ドラッグ操作で値を変更できます。時系列データで「年度を変えながらデータを見る」といった操作に最適です。

ボタンと似ていますが、連続的な値(年度、月、日付など)を順番に操作したい場合は、スライダーの方が直感的です。

年度スライダーを実装する

【スライダーの構造】 fig.update_layout( sliders=[ # ← スライダーのリスト dict( active=0, # ← 最初に選択されているステップ currentvalue={ # ← 現在値の表示設定 ‘prefix’: ‘年度: ‘ }, steps=[ # ← 各ステップの設定 dict( method=’update’, args=[{‘visible’: [True, False, False]}], label=’2022′ ), # 他のステップ… ] ) ] ) 【ポイント】 ・steps: スライダーの各位置に対応する設定 ・active: 初期状態で選択されているステップのインデックス ・currentvalue: スライダー上に「年度: 2024」のように表示
# 年度スライダー付きのグラフ import plotly.graph_objects as go import numpy as np # データを用意 years = [2020, 2021, 2022, 2023, 2024] months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’] # 乱数のシードを固定(再現性のため) np.random.seed(42) fig = go.Figure() # 各年のトレースを追加 for i, year in enumerate(years): # 各年のサンプルデータを生成 sales = 100 + i*10 + np.random.randint(-10, 20, len(months)) fig.add_trace(go.Bar( x=months, y=sales, name=str(year), visible=(i == len(years)-1) # 最新年(2024)のみ表示 )) # スライダーのステップを作成 steps = [] for i, year in enumerate(years): step = dict( method=’update’, args=[ {‘visible’: [j == i for j in range(len(years))]}, # i番目のみTrue {‘title’: f'{year}年 月別売上’} ], label=str(year) ) steps.append(step) # スライダーを追加 fig.update_layout( sliders=[dict( active=len(years)-1, # 最新年を初期選択 currentvalue={‘prefix’: ‘表示年度: ‘}, pad={‘t’: 50}, # 上部の余白 steps=steps )], title=f'{years[-1]}年 月別売上’, xaxis_title=’月’, yaxis_title=’売上(万円)’, yaxis=dict(range=[0, 200]) # Y軸の範囲を固定(スライダー操作時のちらつき防止) ) fig.show()

コードの解説

📝 重要な部分の解説
コード 何をしているか なぜ必要か
visible=(i == len(years)-1) 最後の年のみTrueにする 初期状態で最新年のみ表示するため
[j == i for j in range(len(years))] i番目のみTrueのリストを生成 スライダー移動時に1つだけ表示するため
active=len(years)-1 最後のステップを初期選択 最新年から表示を開始するため
yaxis=dict(range=[0, 200]) Y軸の範囲を固定 スライダー操作時にグラフがガタつかないようにするため

アニメーション機能(プレビュー)

Plotly Expressのanimation_frame引数を使うと、再生ボタン付きのスライダーを簡単に作成できます。データが自動的に切り替わるアニメーションになります。

# アニメーション付きバブルチャート import plotly.express as px # Gapminderデータを読み込み gapminder = px.data.gapminder() # アジアのデータのみ抽出 asia = gapminder[gapminder[‘continent’] == ‘Asia’] # アニメーション付き散布図 fig = px.scatter( asia, x=’gdpPercap’, # X軸: 一人当たりGDP y=’lifeExp’, # Y軸: 平均寿命 size=’pop’, # バブルサイズ: 人口 color=’country’, # 色: 国 hover_name=’country’, # ホバー時のタイトル log_x=True, # X軸を対数スケール size_max=60, # バブルの最大サイズ animation_frame=’year’, # アニメーションの軸: 年 animation_group=’country’, range_x=[100, 100000], # X軸の範囲を固定 range_y=[25, 90], # Y軸の範囲を固定 title=’アジア諸国の発展(年度スライダー付き)’, labels={ ‘gdpPercap’: ‘一人当たりGDP’, ‘lifeExp’: ‘平均寿命’, ‘pop’: ‘人口’ } ) # 凡例を非表示(国が多いため) fig.update_layout(showlegend=False) fig.show()
💡 スライダーの操作方法

ドラッグ:スライダーを左右に動かして任意の位置へ移動

クリック:スライダーの特定位置をクリックしてジャンプ

再生ボタン:(animation_frame使用時)自動でアニメーション再生/一時停止

🎯 7. 実践例:総合ダッシュボード

複数のインタラクティブ機能を組み合わせる

ここまで学んだ機能を組み合わせて、実践的なダッシュボードを作成しましょう。複数のグラフを配置し、それぞれにホバー情報をカスタマイズします。

※ 横長のコードはスマートフォンでは横スクロールできます。

# 多機能インタラクティブダッシュボード import plotly.graph_objects as go from plotly.subplots import make_subplots import pandas as pd import numpy as np # データを用意 np.random.seed(42) months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’] sales = [100, 120, 150, 130, 160, 180] profit = [20, 25, 35, 28, 38, 45] customers = [500, 580, 650, 620, 720, 800] # 2行2列のサブプロットを作成 fig = make_subplots( rows=2, cols=2, subplot_titles=(‘月別売上’, ‘月別利益’, ‘顧客数推移’, ‘売上vs利益’), specs=[[{‘type’: ‘bar’}, {‘type’: ‘bar’}], [{‘type’: ‘scatter’}, {‘type’: ‘scatter’}]] ) # 1. 売上棒グラフ(左上) fig.add_trace( go.Bar( x=months, y=sales, name=’売上’, marker_color=’steelblue’, hovertemplate=’%{x}
売上: %{y}万円‘ ), row=1, col=1 ) # 2. 利益棒グラフ(右上) fig.add_trace( go.Bar( x=months, y=profit, name=’利益’, marker_color=’lightgreen’, hovertemplate=’%{x}
利益: %{y}万円‘ ), row=1, col=2 ) # 3. 顧客数折れ線グラフ(左下) fig.add_trace( go.Scatter( x=months, y=customers, name=’顧客数’, mode=’lines+markers’, line=dict(color=’coral’, width=3), marker=dict(size=10), hovertemplate=’%{x}
顧客数: %{y}人‘ ), row=2, col=1 ) # 4. 売上vs利益散布図(右下) fig.add_trace( go.Scatter( x=sales, y=profit, name=’売上vs利益’, mode=’markers’, marker=dict( size=15, color=profit, colorscale=’Viridis’, showscale=True, colorbar=dict(title=’利益’) ), text=months, hovertemplate=’%{text}
‘ + ‘売上: %{x}万円
‘ + ‘利益: %{y}万円‘ ), row=2, col=2 ) # レイアウト設定 fig.update_layout( title_text=’📊 月次ダッシュボード(インタラクティブ)’, title_font_size=20, showlegend=False, height=800, hovermode=’closest’ ) # 軸ラベルを追加 fig.update_xaxes(title_text=’月’, row=1, col=1) fig.update_xaxes(title_text=’月’, row=1, col=2) fig.update_xaxes(title_text=’月’, row=2, col=1) fig.update_xaxes(title_text=’売上(万円)’, row=2, col=2) fig.update_yaxes(title_text=’売上(万円)’, row=1, col=1) fig.update_yaxes(title_text=’利益(万円)’, row=1, col=2) fig.update_yaxes(title_text=’顧客数’, row=2, col=1) fig.update_yaxes(title_text=’利益(万円)’, row=2, col=2) # HTMLファイルとして保存 fig.write_html(‘interactive_dashboard.html’) fig.show() print(“✅ interactive_dashboard.html として保存されました!”)
【実行結果】 ✅ interactive_dashboard.html として保存されました!
💡 ダッシュボードのポイント

1. サブプロットの活用:make_subplots()で複数のグラフを1つの図にまとめる

2. カスタムホバー:各グラフに適したホバー情報を設定

3. HTMLで共有:write_html()でHTMLファイルとして保存すれば、ブラウザで開くだけでインタラクティブに操作できる

4. 一貫したデザイン:色やフォントを統一して、プロフェッショナルな見た目に

📝 STEP 19 のまとめ

✅ このステップで学んだこと
トピック 重要ポイント
ホバーツールチップ hover_data、customdata、hovertemplateでカスタマイズ
ズーム・パン 範囲制限、dragmode設定、レンジスライダー追加
凡例操作 シングルクリックで切替、ダブルクリックで単独表示
ボタン updatemenusでボタン/ドロップダウンを追加
スライダー slidersで時系列操作、animation_frameで自動再生
ダッシュボード make_subplotsで複数グラフを配置、write_htmlで共有
💡 最重要ポイント

インタラクティブ機能を活用すると、ユーザーが自分でデータを探索できるようになります。

特にホバーツールチップは詳細情報を伝えるのに最適で、ボタンやスライダーは大量のデータを効率的に表示できます。

まずはカスタムホバーから始めて、徐々にボタンやスライダーを追加していくのがおすすめです。次のステップでは、Plotly Expressのさらなる活用法を学びます!

📝 実践演習

演習 1 基礎

tipsデータで、カスタムホバーテンプレートを使った散布図を作成してください。会計額とチップを表示し、右側のボックス(trace名)は非表示にしてください。

【解答コード】
import plotly.express as px tips = px.data.tips() fig = px.scatter( tips, x=’total_bill’, y=’tip’, color=’day’, title=’会計額とチップ(カスタムホバー)’ ) # ホバーテンプレートをカスタマイズ fig.update_traces( hovertemplate=’会計額: $%{x:.2f}
‘ + ‘チップ: $%{y:.2f}
‘ + ‘‘ # 右側のボックスを非表示 ) fig.show()

解説:<extra></extra>を追加することで、ホバー時に表示される「trace 0」などの余分な情報を非表示にできます。

演習 2 応用

3つのデータ系列(データA、データB、データC)を持つ折れ線グラフを作成し、ボタンで切り替えられるようにしてください。「すべて表示」ボタンも追加してください。

【解答コード】
import plotly.graph_objects as go months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’] data_a = [100, 120, 150, 130, 160] data_b = [80, 95, 110, 105, 125] data_c = [60, 75, 90, 85, 100] fig = go.Figure() # 3つのトレースを追加 fig.add_trace(go.Scatter( x=months, y=data_a, name=’データA’, mode=’lines+markers’, visible=True )) fig.add_trace(go.Scatter( x=months, y=data_b, name=’データB’, mode=’lines+markers’, visible=False )) fig.add_trace(go.Scatter( x=months, y=data_c, name=’データC’, mode=’lines+markers’, visible=False )) # ボタンを追加 fig.update_layout( updatemenus=[ dict( type=’buttons’, direction=’left’, buttons=[ dict(args=[{‘visible’: [True, False, False]}], label=’データA’, method=’update’), dict(args=[{‘visible’: [False, True, False]}], label=’データB’, method=’update’), dict(args=[{‘visible’: [False, False, True]}], label=’データC’, method=’update’), dict(args=[{‘visible’: [True, True, True]}], label=’すべて’, method=’update’) ], x=0.1, y=1.15 ) ], title=’データ切替ボタン’ ) fig.show()

解説:3つのトレースがあるので、visibleリストは3つの値を持ちます。「すべて」ボタンでは[True, True, True]とします。

演習 3 発展

2×2のサブプロットを作成し、売上(棒グラフ)、利益(棒グラフ)、売上推移(折れ線)、利益推移(折れ線)を配置してください。各グラフにカスタムホバーを設定してください。

【解答コード】
import plotly.graph_objects as go from plotly.subplots import make_subplots months = [‘1月’, ‘2月’, ‘3月’, ‘4月’, ‘5月’, ‘6月’] sales = [100, 120, 150, 130, 160, 180] profit = [20, 25, 35, 28, 38, 45] # 2×2のサブプロットを作成 fig = make_subplots( rows=2, cols=2, subplot_titles=(‘売上’, ‘利益’, ‘売上推移’, ‘利益推移’) ) # 売上棒グラフ fig.add_trace( go.Bar(x=months, y=sales, name=’売上’, hovertemplate=’%{x}: %{y}万円‘), row=1, col=1 ) # 利益棒グラフ fig.add_trace( go.Bar(x=months, y=profit, name=’利益’, hovertemplate=’%{x}: %{y}万円‘), row=1, col=2 ) # 売上推移 fig.add_trace( go.Scatter(x=months, y=sales, mode=’lines+markers’, name=’売上推移’, hovertemplate=’%{x}: %{y}万円‘), row=2, col=1 ) # 利益推移 fig.add_trace( go.Scatter(x=months, y=profit, mode=’lines+markers’, name=’利益推移’, hovertemplate=’%{x}: %{y}万円‘), row=2, col=2 ) fig.update_layout( title_text=’インタラクティブダッシュボード’, showlegend=False, height=800, hovermode=’x unified’ ) fig.show()

解説:make_subplots()で2×2のレイアウトを作成し、rowcolで配置位置を指定します。各トレースにhovertemplateを設定することで、カスタムホバーが表示されます。

❓ よくある質問

Q1: ホバーの右側に表示される余分な情報を消したいです。どうすればいいですか?
hovertemplateの最後に<extra></extra>を追加しましょう。これで右側のボックス(トレース名など)が非表示になります。例: hovertemplate='値: %{y}<extra></extra>'
Q2: ボタンがうまく動作しません。何が原因ですか?
visibleリストの要素数を確認しましょう。トレース数と一致している必要があります。例えば3つのトレースがある場合、[True, False, False]のように3つの値が必要です。また、add_trace()を呼んだ順番でインデックスが決まることも忘れないでください。
Q3: スライダーとアニメーションの違いは何ですか?
スライダーは手動操作、アニメーションは自動再生です。Plotly Expressのanimation_frameを使うと再生ボタン付きのスライダーが自動で作成されます。手動でスライダーを作る場合はslidersパラメータを使います。アニメーションは時間変化を見せたいとき、スライダーは特定の時点を詳しく見たいときに適しています。
Q4: 作成したグラフを他の人と共有するにはどうすればいいですか?
fig.write_html('filename.html')でHTMLファイルとして保存しましょう。このHTMLファイルはブラウザで開くだけでインタラクティブに操作できます。Pythonがインストールされていない相手にも共有できるのが大きなメリットです。
Q5: スライダーを動かすとグラフがガタガタ動きます。どうすれば直りますか?
軸の範囲を固定しましょう。fig.update_yaxes(range=[0, 200])のように、すべてのデータが収まる範囲を指定します。範囲が固定されていないと、データが変わるたびに軸が自動調整されてガタつきます。
📝

学習メモ

データ可視化マスター - Step 19

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE