LoginSignup
0
0

More than 1 year has passed since last update.

csvからmatplotlibを使ってグラフを書く時、必ず書くこと

Last updated at Posted at 2022-08-24

はじめに

古い情報は初見を殺す凶器

最初にmatplotlibでグラフを描こうとしたら、いくつかコードの書き方があって混乱しました。記事によって書式が異なるとか、立派な初見殺しだと思います。この記事を書いている2022年8月現在、時代遅れではない(いやseaborn使えば?とかは言われるか?)と思いますが、数か月もすると初見殺しのための凶器に成り代わっているかも知れません。その点、読む人はご留意下さい。

なんでグラフを作るのか?

私は様式にある程度合わせた形でグラフが描ければそれで良いって人です。割と平々凡々なグラフを目指しているので、高度な描き方を求める人にこの記事は無用です。

マニュアルについて

matplotlibの公式マニュアルには積極的に触れて欲しいです。最初はweb上の記事を頼って辿って何枚かグラフを作って、その後わかってきた気がした辺りでmatplotlibのマニュアルを漁るべきです。玉石混交のweb上の記事より、スムーズに情報を得られるはずです。

書くこと

なにはともあれライブラリ

グラフを描くためにmatplotlib.pyplotを、csvファイルを読むためにpandasimportしておく。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0