📈 matplotlibで取得データをグラフ化:スクレイピング結果を見える化!
これまでの記事で集めたデータ(BeautifulSoup / Selenium)を、matplotlibで一気に可視化します。
折れ線・棒・散布図、さらに移動平均や注釈、PNG/SVGの保存まで「ブログ掲載」目線でまとめました。
✅ 事前準備
pip install pandas matplotlib
本記事では、日付と値の2列を持つCSV(例:news_counts.csv)を想定します。
date,count
2025-10-01,12
2025-10-02,19
2025-10-03,8
...
🧹 1) データ読み込み&前処理
import pandas as pd
# CSV読み込み
df = pd.read_csv("news_counts.csv")
# 日付型に変換→昇順に揃える
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values("date").reset_index(drop=True)
print(df.head())
🖋 2) 日本語フォント対策(文字化け防止)
環境によっては日本語ラベルが「□」になることがあります。以下のどちらかで解決できます。
- OSに日本語フォント(Noto Sans CJK/IPAexGothicなど)を入れる
- matplotlibでフォントを指定
import matplotlib.pyplot as plt
from matplotlib import font_manager, rcParams
# 例: IPAexGothic を使う(インストール済み前提)
rcParams["font.family"] = "IPAexGothic"
rcParams["axes.unicode_minus"] = False # マイナス記号の文字化け防止
📉 3) 折れ線グラフ(時系列)
まずは基本の折れ線。タイトル・軸ラベル・グリッドを付けて見やすく。
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.plot(df["date"], df["count"])
plt.title("日別件数の推移")
plt.xlabel("日付")
plt.ylabel("件数")
plt.grid(True, alpha=0.4)
plt.tight_layout()
plt.savefig("line_daily_counts.png", dpi=150)
plt.close()
line_daily_counts.png が出力されます(WordPressにアップして本文へ挿入)。
📊 4) 棒グラフ(上位N日のランキング)
# 件数が多い順に上位10日
topN = df.nlargest(10, "count").sort_values("count")
plt.figure(figsize=(8,6))
plt.barh(topN["date"].dt.strftime("%Y-%m-%d"), topN["count"])
plt.title("件数 上位10日")
plt.xlabel("件数")
plt.ylabel("日付")
plt.tight_layout()
plt.savefig("bar_top10.png", dpi=150)
plt.close()
🟢 5) 散布図+移動平均(ノイズをならす)
# 7日移動平均を追加
df["ma7"] = df["count"].rolling(window=7, min_periods=1).mean()
# 散布図(実測)+ 折れ線(移動平均)
plt.figure(figsize=(10,5))
plt.scatter(df["date"], df["count"], s=18) # 実測
plt.plot(df["date"], df["ma7"]) # 7日移動平均
plt.title("散布図+7日移動平均")
plt.xlabel("日付")
plt.ylabel("件数")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("scatter_ma7.png", dpi=150)
plt.close()
📝 6) 注釈・しきい値ライン・ピーク強調
import numpy as np
peak_idx = int(df["count"].idxmax())
peak_x = df.loc[peak_idx, "date"]
peak_y = df.loc[peak_idx, "count"]
threshold = df["count"].median() # しきい値の例:中央値
plt.figure(figsize=(10,5))
plt.plot(df["date"], df["count"])
plt.axhline(threshold, linestyle="--") # しきい値ライン
plt.title("ピーク&しきい値の可視化")
plt.xlabel("日付")
plt.ylabel("件数")
plt.grid(True, alpha=0.3)
# 注釈
plt.annotate(
f"ピーク: {peak_y}",
xy=(peak_x, peak_y),
xytext=(peak_x, peak_y*1.1),
arrowprops=dict(arrowstyle="->", lw=1)
)
plt.tight_layout()
plt.savefig("annot_threshold.png", dpi=150)
plt.close()
💾 7) 画像保存フォーマット(PNG/SVG)
Web掲載はPNGで十分ですが、拡大に強いベクター形式が必要ならSVGも便利。
plt.figure(figsize=(8,4))
plt.plot(df["date"], df["count"])
plt.title("SVG保存例")
plt.tight_layout()
plt.savefig("figure.svg") # ベクター形式
plt.close()
🧩 8) ワンファイル実行スクリプト(コピペ用)
上記を1本にまとめ、CSV→3種グラフ→画像出力までを自動化。
# visualize.py
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams["font.family"] = "IPAexGothic"
rcParams["axes.unicode_minus"] = False
df = pd.read_csv("news_counts.csv")
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values("date").reset_index(drop=True)
df["ma7"] = df["count"].rolling(7, min_periods=1).mean()
# 1) 折れ線
plt.figure(figsize=(10,5))
plt.plot(df["date"], df["count"])
plt.title("日別件数の推移")
plt.xlabel("日付"); plt.ylabel("件数"); plt.grid(True, alpha=0.4)
plt.tight_layout(); plt.savefig("line_daily_counts.png", dpi=150); plt.close()
# 2) 上位10日の横棒
topN = df.nlargest(10, "count").sort_values("count")
plt.figure(figsize=(8,6))
plt.barh(topN["date"].dt.strftime("%Y-%m-%d"), topN["count"])
plt.title("件数 上位10日")
plt.xlabel("件数"); plt.ylabel("日付")
plt.tight_layout(); plt.savefig("bar_top10.png", dpi=150); plt.close()
# 3) 散布+移動平均
plt.figure(figsize=(10,5))
plt.scatter(df["date"], df["count"], s=18)
plt.plot(df["date"], df["ma7"])
plt.title("散布図+7日移動平均")
plt.xlabel("日付"); plt.ylabel("件数"); plt.grid(True, alpha=0.3)
plt.tight_layout(); plt.savefig("scatter_ma7.png", dpi=150); plt.close()
print("✅ グラフ画像を出力しました:line_daily_counts.png / bar_top10.png / scatter_ma7.png")
🧱 9) WordPressへの掲載手順
- 上記スクリプトで生成されたPNG(またはSVG)をWP「メディア」にアップロード
- 本文の任意位置に画像ブロックを追加 → メディアから選択
- 必要に応じて「代替テキスト(alt)」にキーワードを設定(SEO)
⚠️ トラブル対策
- 日本語が□になる:フォント導入&
rcParams["font.family"]で指定 - GUI環境がない:サーバー上では保存だけ行えばOK(
plt.show()は不要) - 日付が重複:
df.groupby("date", as_index=False)["count"].sum()で集計
🏁 まとめ
- matplotlibで折れ線・棒・散布図を素早く作成
- 移動平均や注釈で「伝わるグラフ」に
- PNG/SVG保存→WordPressにアップで見える化完了
収集→整形→可視化までを自動化できれば、記事の説得力が段違いに上がります。次はscheduleやGoogleスプレッドシートAPIと連携して、グラフ画像も定期更新してみましょう!
🧩 次のステップ
- scheduleで毎朝グラフを再生成→自動差し替え
- plotlyでインタラクティブグラフを試す
- Streamlitでダッシュボード化
この記事が役立ったら、ブックマーク&シェアをお願いします!
