目次

概要

Pythonのグラフ描画ライブラリ Matplotlib の覚え書き。

インストール

pip install matplotlib

使い方

日本語を描画する場合

plt.rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'Noto Sans CJK JP']

線グラフの描画

TODO:

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html

散布図の描画

TODO:

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html

ヒストグラムの描画

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))

線の設定

TODO:

グラフを重ねる

TODO:

任意の位置に線を引く

TODO:

任意の位置に文字を書く

TODO:

領域を分割して複数のグラフを描く

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()

サンプル

サーバーのロードアベレージの時系列データをグラフ描画してみる。

サンプルデータ
filesample_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()

結果

sample_loadaverage.png


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS