📋 このステップで学ぶこと
- 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() |
グラフを画面に表示 |
作成したグラフを見るため |
色とサイズで多次元データを表現する
散布図にcolorとsizeを追加すると、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です。
artnasekai
#artnasekai #学習メモ