Pythonのグラフ描画ライブラリ Matplotlib の覚え書き。
pip install matplotlib
plt.rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'Noto Sans CJK JP']
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html
import matplotlib.pyplot as plt x = np.array([42, 32, 44, 43, 36, 14, 22, 35, 45]) plt.hist(x, range=[0, 50], bins=10) plt.grid(True) plt.show()
normed=1 density=True を指定するとヒストグラムが正規化される。(binの面積の合計は1.0となる)
bins_num = 10 # 階級の数 data_num = 1000 normal_data = np.random.normal(0, 1.0, data_num) plt.hist(normal_data, bins=bins_num, density=True) plt.grid(True) plt.show()
目盛りを密度(パーセンテージ)で描画したい場合は、weight を調整するか、目盛りを再計算する。
hist_weight = np.zeros(len(normal_data)) + 1 / len(normal_data) * 100 plt.hist(normal_data, bins=bins_num, weights=hist_weight)
xticks または yticks で目盛りラベルを設定する事ができる。
※figureの場合は set_xticks または set_yticks。
bins_num = 10 data_num = 1000 normal_data = np.random.normal(0, 1.0, data_num) plt.hist(normal_data, bins=bins_num, density=True) plt.yticks([0.1, 0.2, 0.3, 0.4, 0.5, 0.6]) # Y軸メモリを設定 plt.grid(True) plt.show()
plt.grid(True)
plot 時にラベルを指定しつつ、plt.legend を呼ぶことで凡例を表示する事ができる。
data1 = np.random.normal(0, 1.0, 100) data2 = np.random.normal(0, 1.0, 100) plt.plot(data1, label="data1") plt.plot(data2, label="data2") plt.legend() plt.grid(True) plt.show()
細かな表示設定も可能
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html
# フォントサイズ plt.legend(fontsize=10) # 影付き plt.legend(shadow=True) # 凡例の位置を指定 plt.legend(loc='upper right') #plt.legend(loc='lower left') # 図に対する相対的な位置指定 plt.legend(bbox_to_anchor=(1, 1))
from matplotlib import pyplot as plt data = [20, 37, 41, 25, 31, 28, 32, 44, 29, 23] # 日本語フォントを利用可能にしておく plt.rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'Noto Sans CJK JP'] fig = plt.figure(figsize=(15, 5)) # グラフ1 ax1 = fig.add_subplot(1, 2, 1) ax1.plot(data, color="#ef1234") ax1.set_title("線グラフ") # グラフ2 ax2 = fig.add_subplot(1, 2, 2) ax2.hist(data, bins=15) ax2.set_title("ヒストグラム") plt.show()
サーバーのロードアベレージの時系列データをグラフ描画してみる。
サンプルデータ
sample_loadaverage.csv
sample.py
# coding: utf-8 import io import numpy as np import pandas as pd from matplotlib import pyplot as plt import base64 def main(): df = pd.read_csv("sample_loadaverage.csv") # 日本語フォントを利用可能にしておく plt.rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'Noto Sans CJK JP'] plt.title("2019-08-01", size = 10, color = "black") plt.suptitle("Load Average", size = 12, color = "black") plt.xticks(np.arange(0, 144, 6), np.arange(0, 24)) plt.xlabel("時刻") plt.ylabel("ロードアベレージ") plt.plot(df["datetime"], df["load-average01"]) # そのまま描画(jupyter notebook 等の場合) plt.show() # ファイルに出力 plt.savefig("sample_loadaverage.png") # 画像データを取得 buff = io.BytesIO() plt.savefig(buff, format="png") plt.close() # 画像データをbase64エンコードしてHTMLに出力. with open("sample_loadaverage.html", "w") as f: encoded_image = base64.b64encode(buff.getvalue()).decode("utf-8") f.write("<!doctype html>") f.write("<html>") f.write("<meta charset='utf-8'>") f.write("<img src='data:image/png;base64," + encoded_image + "' />") f.write("</html>") if __name__ == "__main__": main()