matplotlibで取得データをグラフ化


📈 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) 日本語フォント対策(文字化け防止)

環境によっては日本語ラベルが「□」になることがあります。以下のどちらかで解決できます。

  1. OSに日本語フォント(Noto Sans CJK/IPAexGothicなど)を入れる
  2. 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への掲載手順

  1. 上記スクリプトで生成されたPNG(またはSVG)をWP「メディア」にアップロード
  2. 本文の任意位置に画像ブロックを追加 → メディアから選択
  3. 必要に応じて「代替テキスト(alt)」にキーワードを設定(SEO)

⚠️ トラブル対策

  • 日本語が□になる:フォント導入&rcParams["font.family"]で指定
  • GUI環境がない:サーバー上では保存だけ行えばOK(plt.show()は不要)
  • 日付が重複df.groupby("date", as_index=False)["count"].sum()で集計

🏁 まとめ

  • matplotlibで折れ線・棒・散布図を素早く作成
  • 移動平均や注釈で「伝わるグラフ」に
  • PNG/SVG保存→WordPressにアップで見える化完了

収集→整形→可視化までを自動化できれば、記事の説得力が段違いに上がります。次はscheduleGoogleスプレッドシートAPIと連携して、グラフ画像も定期更新してみましょう!


🧩 次のステップ

  • scheduleで毎朝グラフを再生成→自動差し替え
  • plotlyでインタラクティブグラフを試す
  • Streamlitでダッシュボード化

この記事が役立ったら、ブックマーク&シェアをお願いします!

タイトルとURLをコピーしました