【初心者向け】Plotlyを使ったPythonでのグラフ作成方法
データ分析において、グラフはデータの傾向やパターンを理解するための強力なツールです。Pythonには様々なグラフ描画ライブラリがありますが、中でもPlotlyは「インタラクティブ性」と「Webでの表示」に優れており、近年人気が高まっています。
この記事では、PythonとPlotlyを使って魅力的なグラフを作成する方法を、初心者の方にも分かりやすく詳細に解説します。環境構築から基本的なグラフ、さらには少し応用的な内容まで網羅していますので、ぜひ最後までお読みいただき、Plotlyマスターへの第一歩を踏み出しましょう。
1. はじめに:Plotlyとは何か?なぜPlotlyを使うのか?
1.1 Plotlyとは?
Plotlyは、Python、R、MATLAB、Julia、JavaScriptなどの様々なプログラミング言語に対応した、オープンソースのグラフ描画ライブラリです。特にPython版は、その使いやすさと機能の豊富さから広く利用されています。
Plotlyの最大の特徴は、作成されるグラフがインタラクティブであることです。静的な画像とは異なり、Plotlyで作成したグラフはWebブラウザ上で操作できます。具体的には、
- マウスカーソルをデータポイントに合わせると詳細情報(ツールチップ)が表示される
- グラフの一部をドラッグしてズームイン/ズームアウトできる
- パン(移動)してグラフ全体を見渡せる
- 凡例をクリックして特定の系列の表示/非表示を切り替えられる
- スライダーやボタンを使ったアニメーションやフィルタリングが可能
これらのインタラクティブ機能により、データ分析の探索的な段階や、結果を他者と共有する際に非常に役立ちます。
また、PlotlyはWeb標準技術(HTML、CSS、JavaScript)に基づいてグラフを生成するため、作成したグラフはWebページに簡単に埋め込むことができます。これにより、分析結果をWebアプリケーションとして公開したり、インタラクティブなレポートを作成したりすることが容易になります。
1.2 なぜPlotlyを使うのか?(MatplotlibやSeabornとの違い)
Pythonでグラフを描く際に最も広く使われているライブラリとして、MatplotlibやSeabornがあります。これらも非常に強力で使いやすいライブラリですが、Plotlyは特に以下のような点で優位性を持つ場合があります。
- インタラクティブ性: MatplotlibやSeabornでインタラクティブなグラフを作成するには、追加の設定やライブラリ(例: mpld3, Bokeh)が必要になることがありますが、Plotlyは標準で強力なインタラクティブ機能を提供します。
- Webでの表示: PlotlyはWebブラウザでの表示に最適化されており、HTMLファイルとして簡単にエクスポートできます。Webアプリケーション(特にPlotlyが提供するDash)との連携も非常にスムーズです。
- 美しさ: Plotlyのデフォルトのグラフデザインは比較的洗練されており、見栄えの良いグラフを簡単に作成できます。
もちろん、MatplotlibやSeabornにもそれぞれの強みがあります。例えば、Matplotlibは非常に低レベルな制御が可能で、あらゆる種類のカスタマイズに対応できます。Seabornは統計グラフの作成に特化しており、少ないコードで統計的に意味のあるグラフを作成できます。
どのライブラリを使うかは、目的によって異なります。
- 研究論文や印刷物など、静的な高品質グラフが必要な場合: Matplotlib
- 統計データの探索的分析で、美しい統計グラフを素早く作成したい場合: Seaborn
- Webでの表示、インタラクティブな操作、ダッシュボード作成など、動的な要素が重要な場合: Plotly
この記事では、Plotlyの強力なインタラクティブ性を活かしたグラフ作成に焦点を当てて解説します。
1.3 この記事の対象読者と目的
- Pythonの基本的な文法は知っているが、データ可視化は初めて、または経験が浅い方
- Plotlyに興味があるが、どこから始めれば良いか分からない方
- インタラクティブなグラフ作成に挑戦したい方
この記事を読むことで、Plotlyを使った基本的なグラフ作成から、インタラクティブ機能の活用方法、そして作成したグラフのエクスポート方法までを習得できます。
2. 環境構築:Plotlyを使う準備をしよう
Plotlyを使ってグラフを作成するためには、Python環境と必要なライブラリが必要です。まだPythonをインストールしていない場合は、公式サイトからダウンロードしてインストールしてください。データ分析では、Anacondaディストリビューションを利用すると、多くの必要なライブラリがまとめてインストールされるため便利です。
Plotlyを使うために必要なライブラリは主に以下の3つです。
- plotly: Plotlyの本体ライブラリ
- pandas: データ分析でよく使われるライブラリ。Plotlyはpandas DataFrameと連携しやすいため推奨。
- numpy: 数値計算ライブラリ。データ準備に役立ちます。
- (オプション) jupyterlab または jupyter notebook: 対話的にコードを実行し、グラフをすぐに確認できるため推奨。
- (オプション) kaleido: 作成したグラフを静止画(PNG, JPGなど)としてエクスポートするために必要。
これらのライブラリは、Pythonのパッケージ管理システムであるpipを使ってインストールできます。コマンドプロンプトやターミナルを開き、以下のコマンドを実行してください。
bash
pip install plotly pandas numpy jupyterlab kaleido
インストールが完了したら、Jupyter LabまたはJupyter Notebookを起動してみましょう。
“`bash
jupyter lab
または
jupyter notebook
“`
Webブラウザが開き、Jupyterの画面が表示されれば準備完了です。新しいノートブックを作成し、Plotlyを使ったグラフ作成を始めてみましょう。
3. Plotlyの基本:plotly.express
とplotly.graph_objects
Plotlyには、大きく分けて2つの高レベルAPIがあります。
plotly.express
(通常px
とエイリアス): 高レベルなインターフェースを提供し、少ないコードで素早く一般的なグラフを作成できます。特にpandas DataFrameとの連携が容易で、データ列を指定するだけで色分けやサイズ分けなどが自動で行われます。初心者にはまずこちらから始めるのがおすすめです。plotly.graph_objects
(通常go
とエイリアス): 低レベルなインターフェースを提供し、グラフの各要素(トレース、レイアウト、軸など)をより細かく制御できます。複雑なグラフや複数のグラフを組み合わせる場合に強力です。
まずはplotly.express
を使って、簡単なグラフ作成から始めましょう。
3.1 基本的なグラフ作成の流れ
Plotlyを使った基本的なグラフ作成の流れは以下のようになります。
- 必要なライブラリのインポート:
plotly.express
やplotly.graph_objects
、データ分析に必要なpandasなどをインポートします。 - データの準備: グラフにしたいデータをPythonのリスト、辞書、またはpandas DataFrameとして準備します。PlotlyはDataFrameを扱うのが得意です。
- Plotly関数の呼び出し: 作成したいグラフの種類に応じたPlotlyの関数(例:
px.scatter
,px.line
,go.Figure
など)を呼び出し、データと設定(x軸、y軸、色など)を渡します。 - グラフの表示: 作成したFigureオブジェクトを表示します。Jupyter環境では、Figureオブジェクトが自動的にHTMLとしてレンダリングされます。
それでは、実際にコードを書いてみましょう。
4. plotly.express
によるグラフ作成
plotly.express
は、データフレームの列名を使って簡単に様々な種類のグラフを作成できます。ここでは代表的なグラフタイプの作成方法を見ていきます。
まずは必要なライブラリをインポートします。
python
import plotly.express as px
import pandas as pd
import numpy as np
4.1 散布図 (Scatter Plot): px.scatter
散布図は、2つの変数間の関係を見るのに適したグラフです。px.scatter
関数を使います。
基本の散布図:
ここでは例として、ランダムなデータを使って簡単な散布図を作成します。
“`python
データの準備
df_scatter = pd.DataFrame({
‘X’: np.random.rand(100) * 100,
‘Y’: np.random.rand(100) * 100
})
散布図の作成
fig_scatter_basic = px.scatter(df_scatter, x=’X’, y=’Y’, title=’基本の散布図’)
グラフの表示
fig_scatter_basic.show()
“`
px.scatter()
の引数にデータフレームとX軸、Y軸に使う列名を指定するだけで簡単に散布図ができます。出力されたグラフはインタラクティブになっており、点をホバーするとXとYの値が表示されます。
色分け、サイズ分け、ホバー情報の追加:
px.scatter
は、データフレームの他の列を使って点の色やサイズ、ホバー情報を簡単にカスタマイズできます。
“`python
データの準備(カテゴリカルデータと数値データを追加)
df_scatter_adv = pd.DataFrame({
‘X’: np.random.rand(150) * 100,
‘Y’: np.random.rand(150) * 100,
‘Category’: np.random.choice([‘A’, ‘B’, ‘C’], 150),
‘Size’: np.random.rand(150) * 30,
‘HoverInfo’: [f’データポイント {i+1}’ for i in range(150)]
})
散布図の作成(色、サイズ、ホバー情報を指定)
fig_scatter_adv = px.scatter(
df_scatter_adv,
x=’X’,
y=’Y’,
color=’Category’, # ‘Category’列の値で色分け
size=’Size’, # ‘Size’列の値で点のサイズを変える
hover_name=’HoverInfo’, # ‘HoverInfo’列の値をホバー時に表示
title=’カスタマイズされた散布図 (色、サイズ、ホバー情報)’
)
グラフの表示
fig_scatter_adv.show()
“`
color
, size
, hover_name
といった引数にデータフレームの列名を指定するだけで、高度な可視化が実現できます。色分けされた点の凡例をクリックすると、そのカテゴリの点だけを表示/非表示に切り替えることもできます。
Plotly組み込みのデータセットを利用した例:
Plotlyには学習やデモ用に使えるいくつかのデータセットが組み込まれています。有名なGapminderデータセットを使ってみましょう。これは世界の国々の人口、平均寿命、GDPなどを年ごとに記録したデータです。
“`python
Plotly組み込みのデータセットをロード
df_gapminder = px.data.gapminder()
print(df_gapminder.head())
2007年のデータで散布図を作成
df_2007 = df_gapminder[df_gapminder[‘year’] == 2007]
fig_gapminder_scatter = px.scatter(
df_2007,
x=’gdpPercap’, # X軸: 一人当たりGDP
y=’lifeExp’, # Y軸: 平均寿命
size=’pop’, # 点のサイズ: 人口
color=’continent’, # 点の色: 大陸
hover_name=’country’, # ホバー情報: 国名
log_x=True, # X軸を対数スケールにする
size_max=60, # 点の最大サイズ
title=’一人当たりGDPと平均寿命の関係 (2007年)’
)
fig_gapminder_scatter.show()
“`
この例では、点のサイズで国の人口、色で大陸を表現しています。また、log_x=True
とすることでX軸を対数スケールにしています。複雑な多次元データを散布図で効果的に表現できることがわかります。
4.2 折れ線グラフ (Line Plot): px.line
折れ線グラフは、時間や順序のあるデータ(時系列データなど)のトレンドを見るのに適しています。px.line
関数を使います。
基本の折れ線グラフ:
“`python
データの準備(時系列データ風)
df_line = pd.DataFrame({
‘Year’: pd.to_datetime([‘2020-01-01’, ‘2020-02-01’, ‘2020-03-01’, ‘2020-04-01’, ‘2020-05-01’]),
‘Value’: [10, 15, 12, 18, 20]
})
折れ線グラフの作成
fig_line_basic = px.line(df_line, x=’Year’, y=’Value’, title=’基本の折れ線グラフ’)
グラフの表示
fig_line_basic.show()
“`
X軸に時系列データを指定することで、自動的に時系列軸として扱われます。
複数の系列を持つ折れ線グラフ:
複数の系列を同じグラフに表示したい場合、color
引数を使います。
“`python
データの準備(複数のカテゴリを持つ時系列データ)
df_line_multi = pd.DataFrame({
‘Year’: pd.to_datetime([‘2020-01-01’, ‘2020-02-01’, ‘2020-03-01’, ‘2020-04-01’, ‘2020-05-01’] * 2),
‘Value’: [10, 15, 12, 18, 20, 8, 12, 10, 15, 17],
‘Category’: [‘A’] * 5 + [‘B’] * 5
})
カテゴリで色分けした折れ線グラフ
fig_line_multi = px.line(df_line_multi, x=’Year’, y=’Value’, color=’Category’, title=’複数の系列を持つ折れ線グラフ’)
グラフの表示
fig_line_multi.show()
“`
Gapminderデータセットを使って、特定の国の平均寿命の年ごとの変化を見てみましょう。
“`python
日本とアメリカのデータだけを抽出
df_japan_us = df_gapminder[df_gapminder[‘country’].isin([‘Japan’, ‘United States’])]
国ごとに色分けした平均寿命の折れ線グラフ
fig_gapminder_line = px.line(
df_japan_us,
x=’year’,
y=’lifeExp’,
color=’country’,
title=’日本とアメリカの平均寿命の推移’
)
fig_gapminder_line.show()
“`
4.3 棒グラフ (Bar Chart): px.bar
棒グラフは、カテゴリごとの数量などを比較するのに適しています。px.bar
関数を使います。
基本の棒グラフ:
“`python
データの準備
df_bar = pd.DataFrame({
‘Category’: [‘A’, ‘B’, ‘C’, ‘D’],
‘Value’: [23, 45, 56, 12]
})
棒グラフの作成
fig_bar_basic = px.bar(df_bar, x=’Category’, y=’Value’, title=’基本の棒グラフ’)
グラフの表示
fig_bar_basic.show()
“`
積み上げ棒グラフ:
color
引数と barmode='stack'
を組み合わせることで、積み上げ棒グラフを作成できます。
“`python
データの準備
df_bar_stack = pd.DataFrame({
‘Category’: [‘A’, ‘A’, ‘B’, ‘B’, ‘C’, ‘C’],
‘Subcategory’: [‘X’, ‘Y’] * 3,
‘Value’: [10, 15, 20, 25, 30, 35]
})
積み上げ棒グラフの作成
fig_bar_stack = px.bar(
df_bar_stack,
x=’Category’,
y=’Value’,
color=’Subcategory’, # ‘Subcategory’の値で色分け&積み上げ
title=’積み上げ棒グラフ’
)
fig_bar_stack.show()
“`
barmode
引数を省略した場合、Plotlyはデフォルトで積み上げ棒グラフを生成することが多いですが、明示的に指定することで意図を明確にできます。barmode='group'
とすると、カテゴリごとに棒を並べて表示することも可能です。
4.4 ヒストグラム (Histogram): px.histogram
ヒストグラムは、数値データの分布を見るのに適しています。データをいくつかの区間(ビン)に分け、各区間に含まれるデータの数を棒の高さで示します。px.histogram
関数を使います。
“`python
データの準備(正規分布に従うランダムデータ)
df_hist = pd.DataFrame({‘Value’: np.random.randn(500) * 10 + 50})
ヒストグラムの作成
fig_hist_basic = px.histogram(df_hist, x=’Value’, title=’基本のヒストグラム’)
グラフの表示
fig_hist_basic.show()
“`
px.histogram
は自動的にビンの数を決定しますが、nbins
引数でビンの数を指定したり、range_x
で軸の範囲を指定したりすることも可能です。
複数の分布の比較:
color
引数を使うことで、カテゴリごとの分布を比較できます。
“`python
Plotly組み込みのIrisデータセットをロード
df_iris = px.data.iris()
print(df_iris.head())
品種ごとのsepal_widthの分布を比較するヒストグラム
fig_hist_multi = px.histogram(
df_iris,
x=’sepal_width’,
color=’species’, # 品種で色分け
title=’品種ごとのsepal_widthの分布’
)
fig_hist_multi.show()
“`
デフォルトでは積み上げられますが、barmode='overlay'
を指定すると、棒が重なって表示され、opacity
で透明度を調整できます。
“`python
fig_hist_overlay = px.histogram(
df_iris,
x=’sepal_width’,
color=’species’,
title=’品種ごとのsepal_widthの分布 (重ねて表示)’,
barmode=’overlay’, # 重ねて表示
opacity=0.7 # 透明度を設定
)
fig_hist_overlay.show()
“`
4.5 箱ひげ図 (Box Plot): px.box
箱ひげ図は、データの分布、中央値、四分位数、外れ値などを要約して示すのに適しています。px.box
関数を使います。
“`python
Plotly組み込みのTipsデータセットをロード
df_tips = px.data.tips()
print(df_tips.head())
total_billの箱ひげ図
fig_box_basic = px.box(df_tips, y=’total_bill’, title=’total_billの箱ひげ図’)
グラフの表示
fig_box_basic.show()
“`
グループごとの箱ひげ図:
カテゴリ変数を使って、グループごとの分布を比較できます。
“`python
曜日ごとのtotal_billの箱ひげ図
fig_box_group = px.box(
df_tips,
x=’day’, # X軸: 曜日
y=’total_bill’, # Y軸: 合計請求額
color=’day’, # 曜日で色分け
title=’曜日ごとの合計請求額の分布’
)
fig_box_group.show()
“`
color
引数を使うと、グループごとに色分けされるだけでなく、インタラクティブに特定のグループをフィルタリングしやすくなります。
4.6 バイオリンプロット (Violin Plot): px.violin
バイオリンプロットは、箱ひげ図に加えてデータの密度分布を滑らかな曲線で表現したものです。データがどの値の周りに集中しているか、分布の形状はどうかなどを把握するのに役立ちます。px.violin
関数を使います。
“`python
Tipsデータセットを使って、曜日ごとのtotal_billのバイオリンプロット
fig_violin_group = px.violin(
df_tips,
x=’day’,
y=’total_bill’,
color=’day’,
box=True, # 中央に箱ひげ図を表示するか
points=’all’, # 個々のデータ点を表示するか (‘none’, ‘ 거짓말쟁이 ‘, ‘all’)
title=’曜日ごとの合計請求額の分布 (バイオリンプロット)’
)
fig_violin_group.show()
“`
box=True
で中央に箱ひげ図を重ねて表示したり、points='all'
で個々のデータ点を重ねて表示したりすることができます。箱ひげ図よりも詳細な分布の形状を視覚的に比較するのに適しています。
4.7 円グラフ (Pie Chart): px.pie
円グラフは、全体の合計に対する各項目の割合を示すのに使われます。px.pie
関数を使います。
“`python
データの準備
df_pie = pd.DataFrame({
‘Category’: [‘Apple’, ‘Banana’, ‘Cherry’, ‘Date’],
‘Value’: [30, 20, 40, 10]
})
円グラフの作成
fig_pie_basic = px.pie(df_pie, values=’Value’, names=’Category’, title=’カテゴリ別割合’)
グラフの表示
fig_pie_basic.show()
“`
values
引数に割合の元となる数値が入った列名、names
引数に各項目の名前が入った列名を指定します。ホバーすると各項目の値と割合が表示されます。
ドーナツグラフ化とテキスト表示の調整:
hole
引数で中央に穴を開けてドーナツグラフにしたり、opacity
で透明度を設定したりできます。また、textinfo
引数でスライス上に表示する情報を制御できます。
“`python
fig_pie_donut = px.pie(
df_pie,
values=’Value’,
names=’Category’,
title=’カテゴリ別割合 (ドーナツグラフ)’,
hole=0.4, # ドーナツグラフにする (0から1までの値)
# textinfo=’percent+label’ # スライス上に割合とラベルを表示
# textinfo=’value’ # スライス上に値を表示
)
fig_pie_donut.show()
“`
4.8 ヒートマップ (Heatmap): px.imshow
/ px.density_heatmap
ヒートマップは、行列形式のデータの値を色の強度で表現するグラフです。相関行列や画像の表示などによく使われます。Plotlyでは、行列データを扱う px.imshow
と、散布データから密度のヒートマップを作成する px.density_heatmap
があります。
行列データからのヒートマップ (px.imshow
):
“`python
データの準備(ランダムな行列データ)
data_matrix = np.random.rand(10, 10)
ヒートマップの作成
fig_imshow = px.imshow(data_matrix, title=’行列データからのヒートマップ’)
グラフの表示
fig_imshow.show()
“`
px.imshow
は、NumPy配列などの行列データを直接受け取ります。画像表示などにも使えます。
散布データからの密度ヒートマップ (px.density_heatmap
):
散布図のように点の集合がある場合に、点の密度をヒートマップで表現します。
“`python
Irisデータセットのsepal_widthとsepal_lengthの密度ヒートマップ
fig_density_heatmap = px.density_heatmap(
df_iris,
x=’sepal_width’,
y=’sepal_length’,
title=’sepal_widthとsepal_lengthの密度ヒートマップ’
)
fig_density_heatmap.show()
“`
これは、散布図で点が密集している領域を色の濃さで示すのに便利です。
4.9 地理空間データ (Geospatial Data): px.choropleth
/ px.scatter_geo
Plotlyは、世界地図や国地図上にデータをマッピングする機能も強力です。
国別データの色分け地図 (px.choropleth
):
国ごとに集計されたデータなどを、国の領域を色分けして表示する地図です(コロプレス地図)。
“`python
Gapminderデータセットの2007年の国ごとの平均寿命を地図に表示
fig_choropleth = px.choropleth(
df_2007,
locations=’country’, # 国名が格納されている列
locationmode=’country names’, # locationsの値が国名であることを指定
color=’lifeExp’, # 色分けに使う値
hover_name=’country’, # ホバー時に表示する国名
animation_frame=’year’, # Gapminder全体を使う場合は年でアニメーション可能
color_continuous_scale=px.colors.sequential.Plasma, # 色のスケール
title=’国別 平均寿命 (2007年)’
)
特定の国だけを表示したい場合は、projectionなどを調整
fig_choropleth.update_layout(geo=dict(showframe=False, showcoastlines=False, projection_type=’equirectangular’))
fig_choropleth.show()
“`
locations
とlocationmode
で地図上のどこにデータをマッピングするかを指定します。color
で色分けする値を指定します。
地理座標上の散布図 (px.scatter_geo
):
緯度・経度データを持つ地点を地図上に点で表示します。
“`python
Plotly組み込みの世界都市データセット
df_quakes = px.data.carshare()
print(df_quakes.head())
地理座標上の散布図(例:レンタカーの利用状況など)
このデータセットは厳密には地震データではなく、レンタカーのGPSデータのようなもの
fig_scatter_geo = px.scatter_geo(
df_quakes,
lat=’centroid_lat’, # 緯度データ列
lon=’centroid_lon’, # 経度データ列
color=’peak_hour’, # 色分けに使うデータ
size=’car_hours’, # サイズに使うデータ
hover_name=’peak_hour’, # ホバー情報
projection=’natural earth’, # 地図の投影法
title=’レンタカー利用状況 (ピーク時間帯別)’
)
fig_scatter_geo.show()
“`
lat
とlon
で緯度・経度を指定し、projection
で地図の表示方法を選びます。
4.10 アニメーショングラフ
plotly.express
の多くの関数は、animation_frame
引数を指定することで簡単にアニメーショングラフを作成できます。これは、時系列データのように時間経過によるデータの変化を追うのに非常に有効です。
最も有名な例は、先ほどのGapminderデータセットを使ったアニメーション散布図です。年ごとの一人当たりGDP、平均寿命、人口、大陸の変化を一度に可視化できます。
“`python
Gapminderデータセット全体(年ごとのデータを含む)
df_gapminder_full = px.data.gapminder()
年ごとのアニメーション散布図
fig_gapminder_anim = px.scatter(
df_gapminder_full,
x=’gdpPercap’,
y=’lifeExp’,
size=’pop’,
color=’continent’,
hover_name=’country’,
animation_frame=’year’, # ‘year’列の値に従ってフレームを切り替える
animation_group=’country’, # 同じ国の点はフレームが変わっても同一視する
log_x=True,
size_max=55,
range_x=[100, 100000], # X軸の範囲を固定
range_y=[25, 90], # Y軸の範囲を固定
title=’世界の国々のGDP、平均寿命、人口の推移 (1952-2007)’
)
fig_gapminder_anim.show()
“`
グラフの下部にスライダーと再生ボタンが表示されます。再生ボタンを押すと、年が進むにつれて各国の点が移動し、その変化を視覚的に追うことができます。animation_group
は、フレームが切り替わっても同じエンティティ(ここでは国)を追跡するために重要です。range_x
とrange_y
で軸の範囲を固定しておくと、アニメーション中に軸が変動せず比較しやすくなります。
他のグラフタイプでも animation_frame
は利用可能です。例えば、棒グラフや折れ線グラフで時系列変化をアニメーションさせることもできます。
5. plotly.graph_objects
による詳細なグラフ制御
plotly.express
は手軽にグラフを作成できますが、より複雑なレイアウトや、複数の異なる種類のグラフを重ね合わせたい場合など、細かい制御が必要な場合はplotly.graph_objects
(通常 go
とエイリアス)を使います。
graph_objects
では、グラフ全体を表現するFigure
オブジェクト、個々のデータ系列(点、線、棒など)を表現するTrace
オブジェクト、そして軸やタイトル、凡例などの設定を含むLayout
オブジェクトという概念を中心に扱います。
基本的な流れは以下のようになります。
- 必要なライブラリのインポート:
plotly.graph_objects
をインポートします。 - Figureオブジェクトの作成:
go.Figure()
を呼び出して空のFigureオブジェクトを作成します。 - Traceオブジェクトの作成:
go.Scatter()
,go.Bar()
などのクラスを呼び出して、表示したいデータ系列ごとにTraceオブジェクトを作成します。 - TraceをFigureに追加:
fig.add_trace()
メソッドを使って、作成したTraceオブジェクトをFigureに追加します。複数のトレースを追加することで、グラフを重ね合わせることができます。 - (オプション) Layoutオブジェクトの更新:
fig.update_layout()
メソッドを使って、タイトル、軸ラベル、凡例などのレイアウトを設定します。 - グラフの表示:
fig.show()
を呼び出します。
5.1 基本的なグラフ作成 (go.Scatter
, go.Bar
など)
go
を使って基本的な散布図と折れ線グラフを作成してみましょう。px.scatter
とは異なり、データはリストやNumPy配列でも直接渡せます。
“`python
import plotly.graph_objects as go
import numpy as np
データの準備
x_data = np.array([1, 2, 3, 4, 5])
y_scatter = np.array([10, 13, 11, 15, 14])
y_line = np.array([8, 9, 10, 11, 12])
Figureオブジェクトの作成
fig_go_basic = go.Figure()
散布図トレースの作成と追加
fig_go_basic.add_trace(go.Scatter(
x=x_data,
y=y_scatter,
mode=’markers’, # 表示形式を点(markers)に指定
name=’散布データ’ # 凡例に表示される名前
))
折れ線グラフトレースの作成と追加
fig_go_basic.add_trace(go.Scatter(
x=x_data,
y=y_line,
mode=’lines’, # 表示形式を線(lines)に指定
name=’トレンド線’ # 凡例に表示される名前
))
レイアウトの更新(タイトル設定)
fig_go_basic.update_layout(title=’graph_objectsを使った基本グラフ’)
グラフの表示
fig_go_basic.show()
“`
この例では、go.Figure()
で空のキャンバスを作り、そこに go.Scatter()
で作成した2つのトレース(散布図と折れ線)を add_trace()
で追加しています。mode
引数で点の表示 (markers
) または線の表示 (lines
) を指定できます。
5.2 複数のトレースを重ねる
add_trace()
を繰り返し呼び出すことで、異なる種類のトレースを重ね合わせることができます。例えば、散布図と、その散布図に対する回帰直線(架空)を重ねて表示してみましょう。
“`python
データの準備
x_reg = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y_reg_scatter = x_reg * 2 + np.random.randn(10) * 3
y_reg_line = x_reg * 2 # 架空の回帰直線
Figureオブジェクトの作成
fig_go_overlay = go.Figure()
散布図トレース
fig_go_overlay.add_trace(go.Scatter(
x=x_reg,
y=y_reg_scatter,
mode=’markers’,
name=’観測データ’,
marker=dict( # 点のスタイルを設定
size=10,
color=’blue’
)
))
折れ線グラフ(回帰直線)トレース
fig_go_overlay.add_trace(go.Scatter(
x=x_reg,
y=y_reg_line,
mode=’lines’,
name=’回帰直線’,
line=dict( # 線のスタイルを設定
color=’red’,
width=2,
dash=’dash’ # 破線に設定
)
))
レイアウトの更新
fig_go_overlay.update_layout(
title=’散布図と回帰直線の重ね合わせ’,
xaxis_title=’X軸’, # X軸ラベル
yaxis_title=’Y軸’ # Y軸ラベル
)
グラフの表示
fig_go_overlay.show()
“`
marker
やline
といった辞書を使って、点や線の色、サイズ、スタイルなどを細かく設定できます。
5.3 複雑なレイアウトの調整 (fig.update_layout
)
fig.update_layout()
メソッドを使うことで、グラフ全体の様々な設定を変更できます。主な設定項目を見てみましょう。
“`python
例として、複数の棒グラフを重ねる
categories = [‘A’, ‘B’, ‘C’]
values1 = [15, 20, 25]
values2 = [10, 12, 18]
fig_layout = go.Figure()
fig_layout.add_trace(go.Bar(
x=categories,
y=values1,
name=’Series 1′
))
fig_layout.add_trace(go.Bar(
x=categories,
y=values2,
name=’Series 2′
))
レイアウトの更新
fig_layout.update_layout(
title={ # タイトルの設定
‘text’: ‘様々なレイアウト設定の例’,
‘y’:0.9, # タイトルのY座標 (0から1)
‘x’:0.5, # タイトルのX座標 (0から1)
‘xanchor’: ‘center’, # X座標の基準
‘yanchor’: ‘top’ # Y座標の基準
},
xaxis_title=’カテゴリ’, # X軸ラベル
yaxis_title=’値’, # Y軸ラベル
xaxis=dict( # X軸のプロパティを設定
tickangle=-45, # 軸ラベルを回転
tickfont=dict(size=12, color=’red’) # 軸ラベルのフォントスタイル
),
yaxis=dict( # Y軸のプロパティを設定
range=[0, 40], # Y軸の表示範囲
showgrid=True, # グリッド線を表示
gridcolor=’lightgrey’ # グリッド線の色
),
legend=dict( # 凡例のプロパティを設定
orientation=”h”, # 凡例を水平に並べる
yanchor=”bottom”, # 凡例のY座標の基準
y=1.02, # 凡例のY座標
xanchor=”right”, # 凡例のX座標の基準
x=1 # 凡例のX座標
),
hovermode=’x unified’ # ホバー情報を軸ごとにまとめる
)
fig_layout.show()
“`
update_layout
の引数には、title
, xaxis
, yaxis
, legend
など、グラフの各要素に対応するプロパティを指定します。これらのプロパティ自体も辞書形式で、さらに詳細な設定(フォント、色、位置など)が可能です。
hovermode='x unified'
は便利な設定で、同じX座標上の複数の系列のホバー情報をまとめて表示してくれます。
5.4 アノテーション(注釈)と図形(線、矩形)の追加
グラフ上の特定のポイントや領域に注釈や図形を追加することもできます。これはグラフから読み取れる重要な情報や傾向を強調したい場合に役立ちます。
“`python
先ほどの散布図に注釈と図形を追加
fig_annotate = go.Figure()
fig_annotate.add_trace(go.Scatter(
x=x_reg,
y=y_reg_scatter,
mode=’markers’,
name=’観測データ’
))
fig_annotate.add_trace(go.Scatter(
x=x_reg,
y=y_reg_line,
mode=’lines’,
name=’回帰直線’
))
レイアウトの更新とアノテーション・図形の追加
fig_annotate.update_layout(
title=’アノテーションと図形を含むグラフ’,
xaxis_title=’X軸’,
yaxis_title=’Y軸’,
annotations=[ # アノテーションのリスト
dict(
x=8, # 注釈のX座標
y=18, # 注釈のY座標
xref=’x’, # 座標系 (‘x’ or ‘paper’)
yref=’y’,
text=’注目ポイント’, # 表示テキスト
showarrow=True, # 矢印を表示するか
arrowhead=1, # 矢印のスタイル
ax=20, # 矢印の終点X座標 (textからの相対位置)
ay=-40 # 矢印の終点Y座標 (textからの相対位置)
)
],
shapes=[ # 図形のリスト
dict(
type=’rect’, # 矩形
xref=’x’, yref=’y’,
x0=2, y0=10, x1=4, y1=15, # 矩形の対角の座標
fillcolor=’LightSalmon’, # 塗りつぶしの色
opacity=0.5, # 透明度
layer=’below’, # グラフ要素の下に描画
line=dict(width=0) # 線なし
),
dict(
type=’line’, # 線
xref=’x’, yref=’y’,
x0=1, y0=8, x1=10, y1=22, # 線の始点と終点座標
line=dict(
color=’Green’,
width=2,
dash=’dot’ # 点線
)
)
]
)
fig_annotate.show()
“`
annotations
は辞書のリストとして指定し、各辞書で1つの注釈を定義します。x
, y
で注釈を付けたいデータ座標を指定し、text
で表示テキストを指定します。showarrow
やarrowhead
, ax
, ay
で矢印の設定が可能です。
shapes
も辞書のリストとして指定し、各辞書で1つの図形を定義します。type
で図形の種類(rect
, line
, circle
など)を指定し、座標やスタイルを設定します。layer='below'
とすると、図形がグラフのデータポイントの下に描画され、データが見えにくくなるのを防げます。
5.5 サブプロット (Subplots): make_subplots
複数のグラフを並べて表示したい場合は、plotly.subplots.make_subplots
関数を使います。これにより、Figureを分割してそれぞれにグラフを配置できます。
“`python
from plotly.subplots import make_subplots
import plotly.graph_objects as go
データの準備
x_sub = [1, 2, 3]
y1_sub = [10, 12, 15]
y2_sub = [50, 45, 60]
1行2列のサブプロットを作成
fig_subplots = make_subplots(rows=1, cols=2,
subplot_titles=(‘グラフ1 (折れ線)’, ‘グラフ2 (棒)’)) # 各サブプロットのタイトル
グラフ1 (左側) に折れ線グラフを追加
fig_subplots.add_trace(go.Scatter(x=x_sub, y=y1_sub, mode=’lines’, name=’系列A’),
row=1, col=1) # 1行目の1列目に配置
グラフ2 (右側) に棒グラフを追加
fig_subplots.add_trace(go.Bar(x=x_sub, y=y2_sub, name=’系列B’),
row=1, col=2) # 1行目の2列目に配置
レイアウトの更新(全体のタイトルなど)
fig_subplots.update_layout(title_text=’サブプロットの例’)
グラフの表示
fig_subplots.show()
“`
make_subplots
でレイアウト(行数rows
、列数cols
)を定義し、add_trace
メソッドを呼び出す際に、row
とcol
引数でどのサブプロットにそのトレースを追加するかを指定します。これにより、簡単に複数のグラフを並べて表示できます。
make_subplots
では、軸を共有する設定や、異なる種類の軸(例えば、一方をY軸、他方をY2軸とする)を持つグラフを重ねることも可能です。これらの高度な機能は、公式ドキュメントを参照してください。
6. インタラクティブ機能の活用
Plotlyの魅力は、作成されたグラフがデフォルトで多くのインタラクティブ機能を持っている点です。これらの機能を理解し、適切に活用することで、より効果的なデータ可視化が可能になります。
-
ホバー情報 (Hover Information): マウスカーソルをデータポイントに重ねると表示される詳細情報です。
px.scatter
などのhover_name
やhover_data
引数で表示内容をカスタマイズできます。go
では、Traceオブジェクトのhoverinfo
やhovertext
、hovertemplate
プロパティで詳細に設定できます。特にhovertemplate
はHTMLタグも使えて非常に柔軟です。 -
ズームとパン (Zoom and Pan): マウスホイールでのズーム、ドラッグでのパンはデフォルトで有効です。ツールバーのアイコンでリセットや特定の領域の選択ズームなども行えます。
-
凡例の操作 (Legend Interaction): 凡例の項目をクリックすることで、その系列の表示/非表示を簡単に切り替えられます。これは複数の系列を持つグラフで、特定の系列に注目したい場合に便利です。
-
ツールバー (Modebar): グラフの右上(または指定した位置)に表示されるアイコン群です。ズーム、パン、選択ツール、自動スケール、ホームボタン(初期表示に戻す)、画像のダウンロードなど、様々な操作が行えます。
fig.show(config={'displayModeBar': True})
やfig.update_layout(modebar_orientation='v')
などで表示/非表示や向きを調整できます。 -
レンジスライダーとセレクター (Range Slider and Selector): 時系列データなど、連続的な軸を持つグラフの下部に範囲選択用のスライダーや、定義済みの範囲を素早く選択するボタンを追加できます。
fig.update_layout(xaxis=dict(rangeslider=dict(visible=True)))
のように設定します。
“`python
時系列データにレンジスライダーを追加
df_stock = px.data.stocks() # 株価データ
fig_rangeslider = px.line(df_stock, x=’date’, y=’GOOG’, title=’Google株価の推移とレンジスライダー’)
fig_rangeslider.update_layout(
xaxis=dict(
rangeselector=dict( # レンジセレクターボタンを追加
buttons=list([
dict(count=1, label=’1m’, step=’month’, stepmode=’backward’),
dict(count=6, label=’6m’, step=’month’, stepmode=’backward’),
dict(count=1, label=’YTD’, step=’year’, stepmode=’todate’),
dict(count=1, label=’1y’, step=’year’, stepmode=’backward’),
dict(step=’all’)
])
),
rangeslider=dict( # レンジスライダーを追加
visible=True
),
type=’date’ # 軸のタイプを日付として指定
)
)
fig_rangeslider.show()
“`
このように、update_layout
の xaxis
(または yaxis
) の設定で、rangeslider
と rangeselector
を追加できます。これにより、長期間の時系列データでも特定の期間に簡単にズームインして詳細を確認できるようになります。
これらのインタラクティブ機能は、Plotlyの強みを最大限に引き出す要素です。作成したグラフを操作して、データの深層を探索してみましょう。
7. グラフのエクスポートと共有
作成したPlotlyグラフは、様々な形式で保存・共有できます。
7.1 静的画像として保存
PNG、JPEG、SVG、PDFといった静止画ファイルとしてグラフを保存できます。これには、環境構築でインストールしたkaleido
ライブラリが必要です。
“`python
作成済みのFigureオブジェクト(例: fig_scatter_basic)を静止画として保存
PNG形式で保存
fig_scatter_basic.write_image(‘scatter_plot.png’)
SVG形式で保存(ベクター形式なので拡大しても劣化しない)
fig_scatter_basic.write_image(‘scatter_plot.svg’)
PDF形式で保存
fig_scatter_basic.write_image(‘scatter_plot.pdf’)
print(“グラフを静止画ファイルとして保存しました。”)
“`
write_image()
メソッドを使います。ファイル名の拡張子でフォーマットを指定できます。解像度を指定したい場合は scale
引数を、サイズを指定したい場合は width
と height
引数を使います。
7.2 HTMLファイルとして保存
Plotlyグラフの最大の利点はインタラクティブ性を保ったままWebブラウザで表示できることです。これを実現するのがHTMLファイルとしてのエクスポートです。
“`python
作成済みのFigureオブジェクト(例: fig_gapminder_anim)をインタラクティブなHTMLファイルとして保存
fig_gapminder_anim.write_html(‘gapminder_animation.html’)
print(“グラフをインタラクティブなHTMLファイルとして保存しました。”)
“`
write_html()
メソッドは、グラフのデータをJavaScriptコードとともに単一のHTMLファイルに保存します。このHTMLファイルをWebブラウザで開けば、Plotlyのインタラクティブ機能をそのまま利用できます。Webサイトへの埋め込みや、インタラクティブなレポートの共有に最適です。
7.3 その他の共有方法
- Plotly Cloud / Chart Studio: Plotlyが提供するオンラインサービスです。グラフをアップロードして公開したり、共同編集したりできます。無料版と有料版があります。
- Dash: Plotlyが提供するPythonフレームワークで、Plotlyグラフを使ったインタラクティブなWebアプリケーションやダッシュボードを構築できます。より本格的な共有やデプロイを考える場合に強力な選択肢となります。
8. 応用的なトピック(簡単な紹介)
この記事は初心者向けですが、Plotlyにはさらに多くの高度な機能があります。
- カスタムツールチップ: ホバー時に表示される情報を、データに基づいてよりリッチに、かつHTMLを使って整形して表示できます。
hovertemplate
プロパティを使いこなすことで実現できます。 - カスタムボタンとドロップダウン: グラフの表示を切り替えたり、データをフィルタリングしたりするためのカスタムUI要素をグラフに追加できます。
fig.update_layout(updatemenus=...)
のように設定します。 - 3Dグラフ:
px.scatter_3d
やgo.Scatter3d
などで3次元散布図や曲面グラフを作成できます。 - 統計関数との連携: SciPyなどの統計ライブラリで計算した結果(回帰直線、信頼区間など)をグラフに重ねて表示することも容易です。
- テーマとテンプレート: グラフの見た目(色、フォント、背景など)をまとめて変更できる組み込みのテーマや、独自のテンプレートを定義できます。
fig.update_layout(template='plotly_dark')
のように使います。 - 大規模データ: Plotlyはブラウザ上で動作するため、非常に大規模なデータポイントを持つグラフではパフォーマンスが低下する可能性があります。Plotlyでは、WebGLを使った高速な描画機能 (
go.Scattergl
,go.Histogram2dContour
など) や、データの集約、フィルタリングなどの手法で大規模データに対応する方法が提供されています。
これらの機能に興味を持った方は、ぜひPlotlyの公式ドキュメントやギャラリーを参照してください。
9. トラブルシューティング
Plotlyを使っている際に遭遇しやすい問題とその解決策をいくつか紹介します。
- グラフが表示されない:
- Jupyter環境でコードを実行していますか?ノートブックのセルの一番最後の出力がFigureオブジェクトであれば、自動的に表示されるはずです。
fig.show()
を明示的に呼び出す癖をつけましょう。 - 必要なライブラリ(
plotly
、pandas
など)は正しくインストールされていますか?pip list
などで確認してみてください。 - 特に古いJupyter環境や、
nbconvert
などで静的に変換しようとしている場合、依存関係や設定が必要なことがあります。まずは最新のJupyter Lab/Notebookで試してみましょう。 - ブラウザのJavaScriptが無効になっていませんか?
- Jupyter環境でコードを実行していますか?ノートブックのセルの一番最後の出力がFigureオブジェクトであれば、自動的に表示されるはずです。
- インタラクティブ機能が効かない:
fig.show()
で表示していますか?静止画として保存した場合は当然インタラクティブになりません。- ブラウザが古い、またはPlotlyのJavaScriptライブラリの読み込みに失敗している可能性があります。ブラウザの開発者ツール(F12キーなどで開けることが多い)のコンソールでエラーが出ていないか確認してみてください。
- HTMLファイルとしてエクスポートした場合は、そのHTMLファイルをブラウザで直接開いてみてください。
kaleido
がインストールされているのにwrite_image
でエラーが出る:kaleido
は外部プロセスとして動作するため、環境によっては実行権限の問題などで失敗することがあります。エラーメッセージを確認し、関連する情報を検索してみてください。環境によっては代替手段(orca
– ただし現在は推奨されない)を検討する必要があるかもしれません。
- データが思った通りにプロットされない:
- データフレームの列名が正しいか、大文字・小文字含めて確認してください。
- データの型(数値、文字列、日付など)が適切か確認してください。Plotlyはデータ型によって軸の扱い方を変えます。特に日付データはPandasのDateTime型になっているか確認しましょう。
px
関数を使う場合、引数(x
,y
,color
,size
など)に指定する列名がデータフレームに存在するか確認してください。
- グラフが重くて表示に時間がかかる:
- データポイントが非常に多い場合(数万〜数十万点以上)、ブラウザでの描画が重くなることがあります。
go.Scattergl
など、WebGLを使ったトレースタイプを検討するか、事前にデータを集約(ビン化、サンプリングなど)してからプロットすることを検討しましょう。
- データポイントが非常に多い場合(数万〜数十万点以上)、ブラウザでの描画が重くなることがあります。
10. まとめ:Plotlyの強力さと次のステップ
この記事では、PythonのPlotlyライブラリを使ったグラフ作成の基本から応用までを詳しく見てきました。
- Plotlyはインタラクティブ性とWeb表示に優れたグラフライブラリである。
plotly.express
は手軽に様々なグラフを作成でき、初心者や素早い可視化に適している。plotly.graph_objects
はグラフの各要素を細かく制御でき、複雑なグラフやカスタマイズが必要な場合に強力である。- 散布図、折れ線グラフ、棒グラフ、ヒストグラム、箱ひげ図、円グラフなど、様々なグラフタイプを簡単に作成できる。
- 色分け、サイズ分け、ホバー情報、アニメーションといったインタラクティブ機能を活用できる。
- 作成したグラフは静止画やインタラクティブなHTMLファイルとして簡単にエクスポート・共有できる。
Plotlyは、単に静的な画像を作成するだけでなく、データを「操作できる」形で表現できる点が大きな魅力です。これにより、データの探索や、分析結果の共有が格段に効率的かつ効果的になります。
この知識を基に、ぜひ様々なデータをPlotlyで可視化してみてください。試行錯誤を重ねることで、データに隠されたパターンやインサイトが見えてくるはずです。
次のステップとして:
- Plotly公式ドキュメントのギャラリーを探索する: 様々なグラフの実装例を見ることができます。
- より複雑なデータセット(自分で用意したCSVファイルなど)を使ってグラフを作成してみる。
graph_objects
を使って、複数のグラフを重ねたり、細かいレイアウト調整に挑戦してみる。- Dashに興味を持った場合は、Dashの公式ドキュメントを見て、インタラクティブなWebアプリケーション開発に挑戦してみる。
データ可視化はデータ分析における非常に重要なスキルです。Plotlyを使いこなして、あなたのデータをより分かりやすく、魅力的に表現できるようになりましょう!