pandasで描画したヒストグラムをnumpyに変換して、画像として出力する
はじめに
pandasで集計したデータをグラフ化して、複数個まとめて一つのグラフにしたいという状況があったのですが、検索してもあまり該当する記事が見当たらなかったので、改めて残しておくことにしました。
実際には以下のリンクで使っているのでよければ覗いてみてください。
実装
pandasのデータを可視化する
例として、Irisデータセットのがく片の長さのヒストグラムを作成していきます。
import pandas as pd
from sklearn import datasets
#irisデータセットロード
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target_names[iris.target]
df['sepal length (cm)'].hist()
可視化したグラフをnumpy形式に変換する
可視化したグラフをcv2で扱えるようにnumpyの形式に変換していきます。グラフを描画とコメントアウトしている部分以下にグラフの描画を行うことで、matplotlibやseaborn等でもnumpy化することができます。
from matplotlib import pyplot as plt
import numpy as np
import cv2
fig, ax = plt.subplots()
# グラフを描画
df['sepal length (cm)'].hist(edgecolor="k",)
plt.grid(True)
fig.canvas.draw()
im = np.array(fig.canvas.renderer.buffer_rgba())
im = cv2.cvtColor(im, cv2.COLOR_RGBA2BGR)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
複数画像を埋め込む
opencvとnumpyでグラフを作成します。
# 背景
img = np.full((750, 600, 3), (222, 222, 222), dtype=np.uint8)
# タイトル
title = 'iris histgram'
cv2.putText(img, title, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), thickness=2)
# ヒストグラム追加
dx, dy = 80, 80
h, w = im.shape[:2]
img[dy:dy+h, dx:dx+w] = im
# ヒストグラム追加
dx, dy = 80, 420
h, w = im2.shape[:2]
img[dy:dy+h, dx:dx+w] = im2
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
おわりに
pandasで作成したヒストグラムをnumpyに変換して、opencvで扱う方法を紹介しました。pandas以外にもmatplotli、seabornでも同様に使うことができます。以上!!