最近、Streamlitで株価チャートを表示しようとネットのサンプルコードを見ていると、Plotlyを使った例が急増していることに気づきました。以前はmatplotlibが主流でしたが、今ではPlotlyが圧倒的に支持されている印象です。
この記事では、Plotlyが選ばれる理由を、従来のmatplotlibとの違いを交えながら解説し、実際にStreamlitで株価チャートを表示する方法を紹介します。
🔍 なぜPlotlyが選ばれるのか?
Plotlyが注目されている最大の理由は、インタラクティブなグラフが簡単に作れることです。
🤔 インタラクティブって何?
「インタラクティブ」とは、ユーザーの操作に応じて画面や動作が変化する仕組みのことです。グラフにおいては、以下のような特徴があります:
- ✅ ズーム:見たい範囲を拡大できる
- ✅ ホバー:マウスを当てると詳細データが表示される
- ✅ リアルタイム更新:スライダーや選択肢でグラフが即座に変化
- ✅ 操作性:ユーザーが自由に動かせるグラフ
Plotlyはこのインタラクティブ性を標準で備えており、Streamlitと組み合わせることで、誰でも簡単にプロっぽいグラフ体験ができます。
🧪 実際に作ってみよう:Plotlyで株価チャート
import streamlit as st
import yfinance as yf
import pandas as pd
import plotly.graph_objects as go
# --- Streamlit アプリの基本設定 ---
st.set_page_config(
page_title="Apple (AAPL) 株価チャート",
page_icon="🍎",
layout="wide"
)
# --- 固定する銘柄コードと期間 ---
TICKER_SYMBOL = "AAPL"
PERIOD = "1y" # 1y = 1年間, 6mo = 6ヶ月, ytd = 年初来
# --- タイトル ---
st.title(f"Apple Inc. ({TICKER_SYMBOL}) 株価チャート 🍎")
st.markdown(f"直近1年間 (`{PERIOD}`) のデータを表示しています。")
st.markdown("---") # 区切り線
# --- 株価データの取得 ---
try:
# yfinanceを使って直近1年間のデータをダウンロード
df = yf.download(TICKER_SYMBOL, period=PERIOD)
# 対策①:マルチインデックス対策
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.get_level_values(0)
# 対策②:カラム名の大文字/小文字 統一
df.columns = [col.title() for col in df.columns]
if df.empty:
st.error("株価データを取得できませんでした。")
else:
# --- ローソク足チャートの描画 ---
fig = go.Figure(
data=[
go.Candlestick(
x=df.index,
open=df['Open'],
high=df['High'],
low=df['Low'],
close=df['Close'],
increasing_line_color='green', # 値上がりを「緑」に
decreasing_line_color='red' # 値下がりを「赤」に
)
]
)
# チャートのレイアウト設定
fig.update_layout(
yaxis_title='株価 (USD)',
xaxis_rangeslider_visible=False # チャート下のスライダーを非表示に
)
# Streamlitにチャートを表示
st.plotly_chart(fig, use_container_width=True)
except Exception as e:
st.error(f"処理中にエラーが発生しました: {e}")
🧱 matplotlib版との比較
import streamlit as st
import yfinance as yf
import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt
# --- Streamlit アプリの基本設定 ---
st.set_page_config(
page_title="Apple (AAPL) 株価チャート (Matplotlib)",
page_icon="🍎",
layout="wide"
)
# --- 固定する銘柄コードと期間 ---
TICKER_SYMBOL = "AAPL"
PERIOD = "1y" # 1y = 1年間, 6mo = 6ヶ月, ytd = 年初来
# --- タイトル ---
st.title(f"Apple Inc. ({TICKER_SYMBOL}) 株価チャート 🍎")
st.markdown(f"**Matplotlib** を使用して、直近1年間 (`{PERIOD}`) のデータを表示しています。")
st.markdown("---") # 区切り線
# --- 株価データの取得 ---
try:
# yfinanceを使って直近1年間のデータをダウンロード
df = yf.download(TICKER_SYMBOL, period=PERIOD)
# 対策①:マルチインデックス対策
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.get_level_values(0)
# 対策②:カラム名の大文字/小文字 統一
df.columns = [col.title() for col in df.columns]
if df.empty:
st.error("株価データを取得できませんでした。")
else:
# --- Matplotlib (mplfinance) でローソ-足チャートを描画 ---
# グラフのスタイルと設定
mc = mpf.make_marketcolors(up='green', down='red', inherit=True)
s = mpf.make_mpf_style(
marketcolors=mc,
gridaxis='both',
gridstyle='--'
)
# 描画オブジェクトの作成
fig, ax = mpf.plot(
df,
type='candle',
style=s,
volume=False,
figsize=(8, 4), # <-- ここでグラフのサイズをさらに小さく指定 (横, 縦)
returnfig=True
)
# StreamlitにMatplotlibのグラフを表示
st.pyplot(fig)
except Exception as e:
st.error(f"処理中にエラーが発生しました: {e}")📊 比較まとめ
| 比較項目 | Plotly | matplotlib(+mplfinance) |
|---|---|---|
| インタラクティブ性 | ✅ ズーム・ホバー・操作可能 | ❌ 静的で操作不可 |
| 見た目の美しさ | ✅ モダンで洗練 | ⚠️ スタイル指定が必要 |
| コードの簡潔さ | ✅ 1ライブラリで完結 | ⚠️ mplfinanceが必要 |
| Streamlitとの統合 | ✅ st.plotly_chart()で即表示 | ✅ st.pyplot()で表示可能 |
| 拡張性 | ✅ DashでWeb化可能 | ⚠️ Web連携は難しい |
| 細かい調整 | ⚠️ 一部可能だが制限あり | ✅ 軸・凡例・色・余白など自由自在 |
🧭 使い分けの補足
Plotlyとmatplotlibはどちらも優れたライブラリですが、目的に応じて使い分けるのがベストです。
- Plotlyを使うべき場面:
- Webアプリやダッシュボードで操作可能なグラフを表示したいとき
- 見た目やユーザー体験を重視したいとき
- ズームやホバーなどのインタラクティブ性が必要なとき
- matplotlibを使うべき場面:
- 論文や資料向けに静的で高精度なグラフを作りたいとき
- 軸や凡例、色、余白などを細かく調整したいとき
- 軽量で素早くグラフを描きたいとき
👉 つまり、手軽さ・操作性を求めるならPlotly、細部までこだわるならmatplotlibです。
✨ まとめ
Streamlitで株価チャートを描くなら、Plotlyが圧倒的におすすめです。インタラクティブ性、見た目、使いやすさのすべてにおいて、matplotlibを凌駕しています。
もちろん、matplotlibにも静的な分析や論文向けの用途では強みがあります。目的に応じて使い分けることで、より効果的な可視化が可能になります。


コメント