STEP 20:Plotly Expressの活用

⚡ STEP 20: Plotly Expressの活用

たった1行のコードで美しいグラフを作れるPlotly Expressをマスターしよう!

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

  • Plotly Expressとは何か、なぜ便利なのか
  • px.scatter()で散布図を作成する方法
  • px.line()で折れ線グラフを作成する方法
  • px.bar()で棒グラフを作成する方法
  • px.histogram()でヒストグラムを作成する方法
  • px.box()とpx.violin()で分布を可視化する方法
  • テーマとテンプレートのカスタマイズ

⚡ 1. Plotly Expressとは

Plotly Expressの概要

Plotly Express(px)は、Plotlyライブラリの「簡易版」です。通常のPlotly(Graph Objects)は細かい制御ができますが、コードが長くなりがちです。

Plotly Expressは、「最小限のコードで最大限の表現力」を実現するために設計されました。たった1行で、インタラクティブで美しいグラフを作成できます。

💡 Plotly Expressを料理に例えると

通常のPlotlyは「フルコース料理を一から作る」ようなものです。材料を揃え、調理し、盛り付けまですべて自分でやります。

Plotly Expressは「ミールキット」です。材料と調味料がセットになっていて、簡単な手順だけで本格的な料理が完成します!

⚡ Plotly Expressの3つの特徴
特徴 説明 メリット
ワンライナー 1行で完成度の高いグラフ コーディング時間を大幅短縮
自動化 凡例、ホバー、色分けを自動生成 細かい設定を書かなくて済む
一貫性 すべての関数が同じ引数パターン 一度覚えれば他の関数も使える

Plotly Expressの共通パラメータ

Plotly Expressのすべての関数は、同じパラメータパターンを共有しています。これを覚えれば、どの関数でも同じように使えます。

📝 共通パラメータ一覧
パラメータ 意味 使用例
data 使用するデータフレーム data=df
x, y X軸、Y軸に使う列名 x=’売上’, y=’利益’
color 色分けに使う列名 color=’地域’
size サイズに使う列名 size=’人口’
hover_data ホバー時に表示する追加情報 hover_data=[‘詳細’]
title グラフのタイトル title=’売上分析’
labels 軸ラベルの辞書 labels={‘x’: ‘X軸’}
height, width グラフのサイズ(ピクセル) height=600, width=800

📊 2. px.scatter()(散布図)

散布図とは

散布図(Scatter Plot)は、2つの変数の関係を点で表すグラフです。「会計額が高いとチップも多いか?」のような相関関係を調べるのに最適です。

基本的な散布図を作る

まず、最もシンプルな散布図を作成してみましょう。Plotly Expressに付属している「iris」データセット(アヤメの花のデータ)を使います。

# ライブラリを読み込む import plotly.express as px
📝 インポートの意味

import plotly.express as pxは、Plotly Expressをpxという短い名前で読み込みます。これはSeabornをsnsと略すのと同じ慣例です。

# サンプルデータを読み込む iris = px.data.iris()
📝 irisデータセットとは

px.data.iris()は、Plotly Expressに付属しているサンプルデータです。アヤメ(花)の測定データで、以下の列が含まれています。

列名 意味 データ型
sepal_length がくの長さ(cm) 数値
sepal_width がくの幅(cm) 数値
petal_length 花びらの長さ(cm) 数値
petal_width 花びらの幅(cm) 数値
species アヤメの種類(3種類) カテゴリ
# 散布図を作成 fig = px.scatter( iris, x=’sepal_length’, y=’sepal_width’, title=’がくの長さと幅’ ) # グラフを表示 fig.show()
📝 コードの意味
コード 意味 なぜ必要か
px.scatter() 散布図を作成する関数 2変数の関係を点で表現するため
iris 使用するデータフレーム どのデータを使うか指定するため
x=’sepal_length’ X軸にがくの長さを使用 横軸に表示する変数を指定
y=’sepal_width’ Y軸にがくの幅を使用 縦軸に表示する変数を指定
fig.show() グラフを画面に表示 作成したグラフを見るため

色とサイズで多次元データを表現する

散布図にcolorsizeを追加すると、1つのグラフで4つの変数を同時に表現できます。これを「多次元データの可視化」と呼びます。

# ========================================= # 【実践】4次元データの散布図 # ========================================= import plotly.express as px # データ読み込み iris = px.data.iris() # 4次元データの散布図 fig = px.scatter( iris, x=’sepal_length’, # X軸: がくの長さ y=’sepal_width’, # Y軸: がくの幅 color=’species’, # 色: 種類で色分け size=’petal_length’, # サイズ: 花びらの長さ hover_data=[‘petal_width’], # ホバー: 花びらの幅を追加表示 title=’アヤメデータ(4次元)’, labels={ ‘sepal_length’: ‘がくの長さ(cm)’, ‘sepal_width’: ‘がくの幅(cm)’, ‘species’: ‘種類’ }, height=600 ) fig.show()
【このグラフから読み取れること】 ・X軸(横軸): がくの長さが長いほど右に位置 ・Y軸(縦軸): がくの幅が広いほど上に位置 ・色: 種類によって色が異なる(3色) ・サイズ: 花びらが長いほど点が大きい → ホバーすると、さらに花びらの幅も確認できる! → これが「インタラクティブ」の威力です

マージナルプロット付き散布図

マージナルプロットとは、散布図の周辺(上と右)に分布を表示する機能です。これにより、各変数の分布と2変数の関係を同時に確認できます。

# ========================================= # 【実践】マージナルプロット付き散布図 # ========================================= import plotly.express as px iris = px.data.iris() # 周辺にヒストグラムと箱ひげ図を追加 fig = px.scatter( iris, x=’sepal_length’, y=’sepal_width’, color=’species’, marginal_x=’histogram’, # X軸の周辺にヒストグラム marginal_y=’box’, # Y軸の周辺に箱ひげ図 title=’マージナルプロット付き散布図’ ) fig.show()
💡 marginalパラメータの選択肢
設定 表示内容 使う場面
marginal=’histogram’ ヒストグラム 分布の形を見たいとき
marginal=’box’ 箱ひげ図 中央値・外れ値を見たいとき
marginal=’violin’ バイオリン図 分布の形状を詳しく見たいとき
marginal=’rug’ ラグプロット(線) データ点の密度を見たいとき

トレンドラインの追加

トレンドライン(回帰直線)を追加すると、2変数の関係の傾向がより明確になります。

# ========================================= # 【実践】トレンドライン付き散布図 # ========================================= import plotly.express as px # tipsデータを読み込み tips = px.data.tips() # 回帰直線を追加 fig = px.scatter( tips, x=’total_bill’, y=’tip’, color=’sex’, trendline=’ols’, # 最小二乗法による回帰直線 title=’会計額とチップ(トレンドライン付き)’ ) fig.show()
📝 trendlineパラメータの意味

trendline=’ols’は、「Ordinary Least Squares(最小二乗法)」の略で、データ点に最も近い直線を引きます。

この直線の傾きがプラスなら「正の相関」(Aが増えるとBも増える)、マイナスなら「負の相関」(Aが増えるとBが減る)を示します。

📈 3. px.line()(折れ線グラフ)

折れ線グラフとは

折れ線グラフは、時系列データの変化を表すのに最適なグラフです。株価の推移、売上の推移、気温の変化などを可視化するときに使います。

基本的な折れ線グラフを作る

# ========================================= # 【実践】基本的な折れ線グラフ # ========================================= import plotly.express as px # 株価データを読み込み stocks = px.data.stocks() # 折れ線グラフ fig = px.line( stocks, x=’date’, # X軸: 日付 y=’GOOG’, # Y軸: Google株価 title=’Google株価推移’ ) fig.show()

複数系列の折れ線グラフ

複数の企業の株価を比較したい場合、yパラメータにリストを渡します。

コードが長いので、スマートフォンでは横スクロールして確認してください。

# ========================================= # 【実践】複数企業の株価比較 # ========================================= import plotly.express as px stocks = px.data.stocks() # 複数の株価を同時に表示 fig = px.line( stocks, x=’date’, y=[‘GOOG’, ‘AAPL’, ‘AMZN’, ‘FB’, ‘NFLX’, ‘MSFT’], # 複数列をリストで指定 title=’GAFAM株価推移’, labels={‘value’: ‘株価(ドル)’, ‘variable’: ‘企業’}, height=600 ) # レイアウトを調整 fig.update_layout( hovermode=’x unified’, # X座標で全系列のホバー表示 xaxis_title=’日付’, yaxis_title=’株価(ドル)’ ) fig.show()
📝 hovermode=’x unified’の意味

通常のホバーは1つの点しか表示されませんが、‘x unified’を設定すると、同じX座標にあるすべての系列の値を一度に表示できます。複数の株価を比較するときに非常に便利です!

カテゴリ別の折れ線グラフ

colorパラメータを使うと、カテゴリ別に線を分けて表示できます。

コードが長いので、スマートフォンでは横スクロールして確認してください。

# ========================================= # 【実践】国別GDP推移 # ========================================= import plotly.express as px # Gapminderデータを読み込み gapminder = px.data.gapminder() # 特定の国のみ抽出 countries = [‘Japan’, ‘United States’, ‘China’, ‘Germany’, ‘United Kingdom’] data = gapminder[gapminder[‘country’].isin(countries)] # 国別のGDP推移 fig = px.line( data, x=’year’, y=’gdpPercap’, color=’country’, # 国別に色分け markers=True, # データ点にマーカーを表示 title=’主要国の一人当たりGDP推移’, labels={ ‘year’: ‘年’, ‘gdpPercap’: ‘一人当たりGDP(ドル)’, ‘country’: ‘国’ } ) fig.show()

📊 4. px.bar()(棒グラフ)

棒グラフとは

棒グラフは、カテゴリ間の値を比較するのに最適なグラフです。商品別の売上、部門別の人数、地域別の統計などを可視化するときに使います。

基本的な棒グラフを作る

# ========================================= # 【実践】基本的な棒グラフ # ========================================= import plotly.express as px import pandas as pd # サンプルデータを作成 data = pd.DataFrame({ ‘商品’: [‘A商品’, ‘B商品’, ‘C商品’, ‘D商品’, ‘E商品’], ‘売上’: [100, 120, 80, 150, 90] }) # 棒グラフ fig = px.bar( data, x=’商品’, y=’売上’, title=’商品別売上’ ) fig.show()

色でグラデーションを付ける

colorパラメータに数値列を指定すると、値に応じたグラデーションで色分けされます。

# ========================================= # 【実践】グラデーション付き棒グラフ # ========================================= import plotly.express as px import pandas as pd data = pd.DataFrame({ ‘商品’: [‘A商品’, ‘B商品’, ‘C商品’, ‘D商品’, ‘E商品’], ‘売上’: [100, 120, 80, 150, 90] }) # 売上の値で色分け fig = px.bar( data, x=’商品’, y=’売上’, color=’売上’, # 売上の値で色分け color_continuous_scale=’Viridis’, # カラースケールを指定 title=’商品別売上(グラデーション)’ ) fig.show()
🎨 人気のカラースケール
カラースケール 特徴 使う場面
Viridis 紫→緑→黄色 一般的な数値データ(推奨)
Blues 薄い青→濃い青 ビジネス資料
RdYlGn 赤→黄→緑 良い/悪いを表現
Plasma 紫→オレンジ→黄 科学的な可視化

グループ化された棒グラフ

barmodeパラメータで、複数カテゴリの表示方法を指定できます。

# ========================================= # 【実践】グループ化された棒グラフ # ========================================= import plotly.express as px tips = px.data.tips() # 曜日×性別でグループ化 fig = px.bar( tips, x=’day’, y=’tip’, color=’sex’, barmode=’group’, # ‘group’(並列)または ‘stack’(積み上げ) title=’曜日・性別別の平均チップ’ ) fig.show()
📝 barmodeパラメータの選択肢
設定 表示方法 使う場面
barmode=’group’ 棒を横に並べる カテゴリ間の比較をしたいとき
barmode=’stack’ 棒を積み上げる 合計と内訳を同時に見たいとき
barmode=’relative’ 正負を分けて積み上げ 正負の値があるとき

水平棒グラフ

カテゴリ名が長い場合は、水平棒グラフの方が読みやすくなります。

# ========================================= # 【実践】水平棒グラフ(売上順でソート) # ========================================= import plotly.express as px import pandas as pd # データを作成 data = pd.DataFrame({ ‘商品’: [‘A商品’, ‘B商品’, ‘C商品’, ‘D商品’, ‘E商品’], ‘売上’: [100, 120, 80, 150, 90] }) # 売上順にソート data = data.sort_values(‘売上’) # 水平棒グラフ fig = px.bar( data, y=’商品’, # Y軸に商品(カテゴリ) x=’売上’, # X軸に売上(数値) orientation=’h’, # 水平方向を指定 title=’商品別売上(売上順)’ ) fig.show()

📊 5. px.histogram()(ヒストグラム)

ヒストグラムとは

ヒストグラムは、データの分布を可視化するグラフです。「データがどの範囲に集中しているか」「ばらつきはどのくらいか」を調べるときに使います。

基本的なヒストグラムを作る

# ========================================= # 【実践】基本的なヒストグラム # ========================================= import plotly.express as px tips = px.data.tips() # ヒストグラム fig = px.histogram( tips, x=’total_bill’, nbins=30, # ビン(区間)の数 title=’会計額の分布’ ) fig.show()

カテゴリ別の重ねヒストグラム

colorパラメータでカテゴリ別に色分けし、barmode=’overlay’で重ねて表示できます。

# ========================================= # 【実践】性別で重ねたヒストグラム # ========================================= import plotly.express as px tips = px.data.tips() # 性別で色分けして重ねる fig = px.histogram( tips, x=’total_bill’, color=’sex’, nbins=25, barmode=’overlay’, # 重ねて表示 opacity=0.7, # 透明度(重なりが見えるように) title=’会計額の分布(性別比較)’ ) fig.show()

📦 6. px.box()とpx.violin()(分布の可視化)

箱ひげ図とバイオリン図の違い

箱ひげ図(Box Plot)バイオリン図(Violin Plot)は、どちらもデータの分布を可視化するグラフです。

📊 箱ひげ図 vs バイオリン図
グラフ 表示内容 メリット
箱ひげ図 中央値、四分位数、外れ値 シンプルで比較しやすい
バイオリン図 分布の形状を滑らかに表現 分布の詳細がわかる

箱ひげ図を作る

# ========================================= # 【実践】箱ひげ図 # ========================================= import plotly.express as px tips = px.data.tips() # 箱ひげ図 fig = px.box( tips, x=’day’, y=’tip’, color=’sex’, title=’曜日・性別別チップの分布(箱ひげ図)’, points=’all’ # すべてのデータ点を表示 ) fig.show()

バイオリン図を作る

# ========================================= # 【実践】バイオリン図 # ========================================= import plotly.express as px tips = px.data.tips() # バイオリン図 fig = px.violin( tips, x=’day’, y=’tip’, color=’sex’, box=True, # 内部に箱ひげ図を表示 points=’all’, # すべてのデータ点を表示 title=’曜日・性別別チップの分布(バイオリン図)’ ) fig.show()
💡 pointsパラメータの選択肢
設定 表示内容 使う場面
points=’all’ すべてのデータ点 データ数が少ないとき
points=’outliers’ 外れ値のみ 外れ値を確認したいとき
points=False データ点を非表示 データ数が多いとき

🎯 7. 実践例:ワンライナーの威力

5次元データのバブルチャート

Plotly Expressの真価は、複雑なグラフも数行で作れることです。以下の例では、5つの変数を同時に可視化しています。

コードが長いので、スマートフォンでは横スクロールして確認してください。

# ========================================= # 【実践】5次元データのバブルチャート # ========================================= import plotly.express as px # Gapminderデータを読み込み gapminder = px.data.gapminder() # 2007年のデータのみ抽出 data_2007 = gapminder[gapminder[‘year’] == 2007] # 5次元データを1つのグラフで表現 fig = px.scatter( data_2007, x=’gdpPercap’, # X軸: 一人当たりGDP y=’lifeExp’, # Y軸: 平均寿命 size=’pop’, # サイズ: 人口 color=’continent’, # 色: 大陸 hover_name=’country’, # ホバー: 国名を大きく表示 log_x=True, # X軸を対数スケール size_max=60, # マーカーの最大サイズ title=’2007年 世界各国の経済と健康’, labels={ ‘gdpPercap’: ‘一人当たりGDP(ドル、対数スケール)’, ‘lifeExp’: ‘平均寿命(歳)’, ‘pop’: ‘人口’, ‘continent’: ‘大陸’ }, height=700 ) fig.show()
【このグラフで表現している5次元】 1. X軸: 一人当たりGDP(経済力) 2. Y軸: 平均寿命(健康状態) 3. サイズ: 人口(国の大きさ) 4. 色: 大陸(地理的分類) 5. ホバー: 国名(詳細情報) → たった10行程度のコードで、これだけの情報を表現! → ホバーすると国名が表示されるインタラクティブ機能付き

ファセット(小さな倍数)

ファセットとは、カテゴリ別にグラフを分割して並べる機能です。facet_col(列方向)とfacet_row(行方向)で指定します。

# ========================================= # 【実践】ファセットで多次元分析 # ========================================= import plotly.express as px tips = px.data.tips() # 時間帯と性別でグラフを分割 fig = px.scatter( tips, x=’total_bill’, y=’tip’, color=’smoker’, facet_col=’sex’, # 列で分割(性別) facet_row=’time’, # 行で分割(時間帯) title=’多次元ファセット分析’, height=800 ) fig.show()

🎨 8. テーマとテンプレート

テンプレートとは

テンプレートは、グラフ全体のデザイン(背景色、フォント、グリッド線など)をまとめた設定です。テンプレートを変えるだけで、グラフの印象が大きく変わります。

🎨 主要なテンプレート一覧
テンプレート名 特徴 使う場面
plotly デフォルト(明るい青背景) 通常の分析
plotly_white 白背景でシンプル ビジネス資料
plotly_dark ダークモード プレゼン、ダッシュボード
ggplot2 R言語のggplot2風 学術論文
seaborn Seaborn風 統計分析
simple_white 最もシンプルな白背景 印刷物
# ========================================= # 【実践】ダークテーマのグラフ # ========================================= import plotly.express as px iris = px.data.iris() fig = px.scatter( iris, x=’sepal_length’, y=’sepal_width’, color=’species’, template=’plotly_dark’, # ダークテーマを適用 title=’ダークテーマのグラフ’ ) fig.show()

デフォルトテンプレートの設定

毎回templateを指定するのが面倒な場合、デフォルトのテンプレートを設定できます。

# ========================================= # 【実践】デフォルトテンプレートの設定 # ========================================= import plotly.io as pio import plotly.express as px # すべてのグラフにテンプレートを適用 pio.templates.default = ‘plotly_white’ # または px.defaults.template = ‘plotly_white’ print(“✅ デフォルトテンプレートを’plotly_white’に設定しました”)

📝 STEP 20 のまとめ

✅ このステップで学んだこと
トピック 重要ポイント
Plotly Express 最小限のコードで最大限の表現力を実現
px.scatter() 散布図、マージナルプロット、トレンドライン
px.line() 折れ線グラフ、複数系列の比較
px.bar() 棒グラフ、グループ化、積み上げ
px.histogram() ヒストグラム、カテゴリ別比較
px.box()/violin() 箱ひげ図、バイオリン図で分布を可視化
共通パラメータ color、size、facet_col/rowで多次元表現
テンプレート plotly_white、plotly_darkなどでデザイン変更
💡 最重要ポイント

Plotly Expressは「少ないコードで多くを表現」の哲学を体現しています。

覚えておくべきパターンは:px.関数名(data, x=’列名’, y=’列名’, color=’列名’, …)です。この形を覚えれば、どの関数も同じように使えます。

次のステップでは、3Dグラフの作成方法を学びます。立体的なデータ可視化で、さらに表現の幅が広がります!

📝 実践演習

演習 1 基礎

tipsデータで、会計額(total_bill)のヒストグラムを作成してください(ビン数30)。

【解答コード】
import plotly.express as px tips = px.data.tips() fig = px.histogram( tips, x=’total_bill’, nbins=30, title=’会計額の分布’ ) fig.show()

ポイント:nbinsでビンの数を指定します。

演習 2 応用

irisデータで、種類別(species)に色分けした散布図を作成し、周辺にヒストグラムを追加してください。

【解答コード】
import plotly.express as px iris = px.data.iris() fig = px.scatter( iris, x=’sepal_length’, y=’sepal_width’, color=’species’, marginal_x=’histogram’, marginal_y=’histogram’, title=’アヤメデータ(マージナルヒストグラム付き)’ ) fig.show()

ポイント:marginal_xとmarginal_yで周辺にグラフを追加できます。

演習 3 発展

gapminderデータ(2007年)で、大陸別にファセット分割したバブルチャートを作成してください(X軸:GDP、Y軸:平均寿命、サイズ:人口)。

【解答コード】
import plotly.express as px gapminder = px.data.gapminder() data_2007 = gapminder[gapminder[‘year’] == 2007] fig = px.scatter( data_2007, x=’gdpPercap’, y=’lifeExp’, size=’pop’, color=’continent’, hover_name=’country’, facet_col=’continent’, facet_col_wrap=3, log_x=True, title=’2007年 大陸別の経済と健康’, height=800 ) fig.show()

ポイント:facet_col_wrapで1行あたりの列数を指定できます。

❓ よくある質問

Q1: Plotly ExpressとSeabornはどちらを使うべきですか?
用途で使い分けましょう。インタラクティブなWebグラフ、ダッシュボード、プレゼン用→Plotly Express。静的な統計グラフ、論文用、印刷物→Seaborn。両方使える場合は、Plotly Expressの方がインタラクティブで共有しやすいです。
Q2: マージナルプロットが表示されません。なぜですか?
marginal_xやmarginal_yパラメータはpx.scatter()とpx.histogram()のみ対応しています。また、colorパラメータと組み合わせる場合、カテゴリ数が多すぎると表示が崩れることがあります。カテゴリを絞るか、別の方法を検討してください。
Q3: ファセットのグラフが小さすぎます。どうすればいいですか?
heightとwidthパラメータを大きくしましょう。例えば、height=1000, width=1400のように指定します。また、facet_col_wrapで1行あたりの列数を減らすと、各グラフが大きくなります。
Q4: Plotly Expressで作ったグラフを画像として保存できますか?
はい、できます。fig.write_image(‘graph.png’)で画像として保存できます。ただし、追加のライブラリ(kaleido)が必要です。pip install kaleidoでインストールしてから使ってください。
Q5: 自分のデータでも使えますか?サンプルデータ以外で。
もちろんです!Pandasのデータフレームであれば何でも使えます。CSVファイルをdf = pd.read_csv(‘data.csv’)で読み込んで、px.scatter(df, x=’列名’, y=’列名’)のように指定すればOKです。
📝

学習メモ

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

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