はじめに
古い情報は初見を殺す凶器
最初にmatplotlibでグラフを描こうとしたら、いくつかコードの書き方があって混乱しました。記事によって書式が異なるとか、立派な初見殺しだと思います。この記事を書いている2022年8月現在、時代遅れではない(いやseaborn
使えば?とかは言われるか?)と思いますが、数か月もすると初見殺しのための凶器に成り代わっているかも知れません。その点、読む人はご留意下さい。
なんでグラフを作るのか?
私は様式にある程度合わせた形でグラフが描ければそれで良いって人です。割と平々凡々なグラフを目指しているので、高度な描き方を求める人にこの記事は無用です。
マニュアルについて
matplotlib
の公式マニュアルには積極的に触れて欲しいです。最初はweb上の記事を頼って辿って何枚かグラフを作って、その後わかってきた気がした辺りでmatplotlib
のマニュアルを漁るべきです。玉石混交のweb上の記事より、スムーズに情報を得られるはずです。
書くこと
なにはともあれライブラリ
グラフを描くためにmatplotlib.pyplot
を、csvファイルを読むためにpandas
をimport
しておく。
import matplotlib.pyplot as plt
import pandas as pd
データ読み込み
pandas
を使ってcsvファイルを読み、一旦numpy
形式に落とす。私はいちいちheaderを書くのが面倒なので、df.columns.values.tolist()
でheader情報を抽出して列番号で指定します。import numpy as np
は不要と認識してますが、どうでしょう?
fn = "hoge.csv"
df = pd.read_csv(fn,encoding='cp932')
hd = df.columns.values.tolist()
x1 = df[hd[0]].values
y1 = df[hd[1]].values
デフォルトのフォント設定
デフォルトのフォントとフォントサイズの指定。これしか使わない気がする。
plt.rcParams["font.family"] = "DejaVu serif"
plt.rcParams["font.size"] = 9
グラフを描くエリアの大きさ設定
グラフを描く領域の大きさと、何分割してグラフを設置するか定めます。後から追加する流儀もあるようですが、私は最初からsubplots
で定めます。どう並べるかによってax(s)
の形が変わるので注意。
cm = 1/2.54
fig, ax = plt.subplots(1, 1, figsize=(14*cm,9*cm),dpi=600,layout='constrained')
ax.hoge
cm = 1/2.54
fig, axs = plt.subplots(2, 1, figsize=(14*cm,9*cm),dpi=600,layout='constrained')
axs[0].hoge
cm = 1/2.54
fig, axs = plt.subplots(2, 2, figsize=(14*cm,9*cm),dpi=600,layout='constrained')
axs[0,0].hoge
グラフひとつひとつの設定
目盛を内側に向ける。
axs[0,0].tick_params(which="both",direction="in")
axs[0,0].tick_params(left=True,right=True,top=True,bottom=True)
各軸にラベル付けをする。グラフを並べる時、ラベルを貼りたくないグラフがあるなら、そこには何も書かなければ大丈夫、のはず?axes.set()
で定めていくStyleが私は好きです。
axs[0,0].set(xlabel='hoge [hoge]')
axs[0,0].set(ylabel='hoge [hoge]')
各軸の値の範囲を定める。
axs[0,0].set(xlim=[0,1])
axs[0,0].set(ylim=[0,1])
軸と軸の値ラベルが近い時は、これで調整。
axs[0,0].tick_params(pad=5)
プロットしましょう。
axs[0,0].plot(x1, y4, label="hoge1")
凡例を突っ込みまして。
axs[0,0].legend(loc='upper left', bbox_to_anchor=(0,1))
こういった作業を、すべてのax(s)
に対して行います。
出来上がったグラフを保存
pdfとpngに保存です。データ点数が多い時はpdfが地獄のように重たくなるのでpngで表示します。ラスタ画像なら全部必死に描いたりせず、各画素がそれぞれ何色~という処理だけで済むので、軽い。
fig.savefig("hoge.pdf")
fig.savefig("hoge.png")
つなげたもの
import matplotlib.pyplot as plt
import pandas as pd
fn = "hoge.csv"
df = pd.read_csv(fn,encoding='cp932')
hd = df.columns.values.tolist()
x1 = df[hd[0]].values
y1 = df[hd[1]].values
plt.rcParams["font.family"] = "DejaVu serif"
plt.rcParams["font.size"] = 9
cm = 1/2.54
fig, axs = plt.subplots(2, 2, figsize=(14*cm,9*cm),dpi=600,layout='constrained')
axs[0,0].hoge
axs[0,0].tick_params(which="both",direction="in")
axs[0,0].tick_params(left=True,right=True,top=True,bottom=True)
axs[0,0].set(xlabel='hoge [hoge]')
axs[0,0].set(ylabel='hoge [hoge]')
axs[0,0].set(xlim=[0,1])
axs[0,0].set(ylim=[0,1])
axs[0,0].plot(x1, y4, label="hoge1")
axs[0,0].legend(loc='upper left', bbox_to_anchor=(0,1))
fig.savefig("hoge.pdf")
fig.savefig("hoge.png")