Matplotlib 覚え書き

Python
  • 2023/02/07

最近、matplotlib を使うことがあったので、個人的によく使う matplotlib の機能について整理しました。

使うデータ

下記のデータを取り込んだcsvファイルdata.csvを作成し、pandasで読み込んでから使用することにします。
1列目のデータを横軸、2列目のデータを縦軸として使います。

time,value
1,4.84163368
2,15.38505919
3,42.35096536
4,22.83927361
5,62.6732269
6,31.89646478
7,16.74838902
8,80.20569496
9,99.35598419
10,60.82346391
11,6.45335282
12,33.56849724
13,33.5150531
14,34.72228938
15,5.00173312
16,71.27694761
17,22.23884446
18,93.11127548
19,27.25996025
20,14.16525846
21,23.76336451
22,21.4812403
23,13.69519197
24,18.82479346

複数のデータを扱うコードでは、下記のデータをdata2.csvに保存して使っています。

time,value2
1,49.65376763
2,68.20295038
3,46.74207925
4,51.65606035
5,87.01716953
6,34.83813965
7,17.13263927
8,70.82623704
9,82.59281866
10,96.09023806
11,21.76404442
12,17.04621867
13,15.2462883
14,31.34677061
15,84.88935453
16,85.50437573
17,55.60167493
18,58.49183961
19,56.57915667
20,88.90905672
21,36.49779484
22,77.29814013
23,80.6791341
24,5.323337652

単一データの折れ線グラフの表示

まずは一番シンプルな、単一の折れ線グラフの表示をします。

import pandas as pd
import matplotlib.pyplot as plt

file_name = 'data.csv'
df = pd.read_csv(file_name)

data_x = df[df.columns[0]] # x軸に1列目のデータを設定する
data_y = df[df.columns[1]] # y軸に2列目のデータを設定する

fig, ax = plt.subplots()

ax.plot(data_x, data_y, linestyle='solid', marker='o')

ax.set_xlabel(df.columns[0]) # 1列目の列名をラベルに設定する
ax.set_ylabel(df.columns[1]) # 2列目の列名をラベルに設定する

plt.show()

このコードを実行すると、下記のグラフが表示されます。

image.png

このようなグラフは下記のような書き方でも表示できます。

import pandas as pd
import matplotlib.pyplot as plt

file_name = 'data.csv'
df = pd.read_csv(file_name)

data_x = df[df.columns[0]]
data_y = df[df.columns[1]]

fig = plt.figure()
plt.plot(data_x, data_y)

plt.xlabel(df.columns[0])
plt.ylabel(df.columns[1])

plt.show()

このコードの場合、表示は下記のようになります。 image.png

先ほどのコードでは丸のマーカーが設定されていましたが、このコードではマーカーはデフォルトで設定されていません。

画像の保存

作成した画像を保存するにはplt.savefig()を使います。

file_name = 'data.csv'
df = pd.read_csv(file_name)

data_x = df[df.columns[0]]
data_y = df[df.columns[1]]

fig, ax = plt.subplots()

ax.plot(data_x, data_y, linestyle='solid', marker='o')

ax.set_xlabel(df.columns[0])
ax.set_ylabel(df.columns[1])

plt.savefig("data.png", format="png", dpi=300)

複数のデータを1つのグラフにまとめて表示する

複数のデータを表示する場合はこのようなコードになります。

file_name1 = 'data.csv'
df1 = pd.read_csv(file_name1)
data_x1 = df1[df1.columns[0]]
data_y1 = df1[df1.columns[1]]

file_name2 = 'data2.csv'
df2 = pd.read_csv(file_name2)
data_x2 = df2[df2.columns[0]]
data_y2 = df2[df2.columns[1]]

fig = plt.figure()
plt.plot(data_x1, data_y1, label='data1')
plt.plot(data_x2, data_y2, label='data2')

plt.xlabel(df1.columns[0])
plt.ylabel(df1.columns[1])

plt.legend(loc = 'upper right')

plt.show()

plt.plot()にはlabelを設定していますが、これは凡例に使われます。
表示は下記のようになります。
image.png

複数のグラフを1つの画像にまとめて表示する

先ほどとは違い、複数のデータをそれぞれ別のグラフ上にプロットし、それらをまとめて表示します。

file_name1 = 'data.csv'
df1 = pd.read_csv(file_name1)
data_x1 = df1[df1.columns[0]]
data_y1 = df1[df1.columns[1]]

file_name2 = 'data2.csv'
df2 = pd.read_csv(file_name2)
data_x2 = df2[df2.columns[0]]
data_y2 = df2[df2.columns[1]]

fig = plt.figure(figsize = (12,4))

ax1 = fig.add_subplot(1, 2, 1) #縦の数、横の数、位置
ax2 = fig.add_subplot(1, 2, 2)

ax1.plot(data_x1, data_y1, label='data1') #labelは凡例に使う
ax2.plot(data_x2, data_y2, label='data2')

plt.show()

表示は下記のようになります。 image.png

fig.add_subplot(x, y, z)はそれぞれ、xが行数、yが列数、zが位置を示しています。
x, yをそれぞれ変えることで下記のようにグラフの大きさを別々にすることもできます。

ax1 = fig.add_subplot(1, 2, 1) #縦の数、横の数、位置
ax2 = fig.add_subplot(2, 2, 2)

image.png

2種類の縦軸を設定する

複数のデータを一つのグラフにプロットする場合、値の範囲が異なるときは別々の縦軸を用意して表示させることができます。

下記のようなデータをdata3.csvに保存し、data.csvと一緒に一つのグラフに表示させてみます。

time,value
1,0.424610003
2,0.664443299
3,0.483156832
4,0.439062982
5,0.979858031
6,0.034746821
7,0.518204148
8,0.687933586
9,0.565848351
10,0.446730204
11,0.534440638
12,0.228253764
13,0.235302654
14,0.103250887
15,0.961099774
16,0.904709954
17,0.528538318
18,0.562917982
19,0.751827001
20,0.436832146
21,0.243265353
22,0.344573446
23,0.615479212
24,0.700233057
file_name1 = 'data.csv'
df1 = pd.read_csv(file_name1)
data_x1 = df1[df1.columns[0]]
data_y1 = df1[df1.columns[1]]

file_name2 = 'data3.csv'
df2 = pd.read_csv(file_name2)
data_x2 = df2[df2.columns[0]]
data_y2 = df2[df2.columns[1]]

fig = plt.figure(figsize = (6, 4))

ax1 = fig.add_subplot(1, 1, 1)
ax2 = ax1.twinx()

ax1.plot(data_x1, data_y1, label='data1')
ax2.plot(data_x2, data_y2, color='green', label='data2')

plt.show()

twinx()でax1を複製しているのですが、この場合プロット線の色も同じになってしまうので、plot()でcolorを設定することで区別できるようにしています。
表示結果は下記のようになります。 image.png

軸の範囲を設定する

縦軸、横軸それぞれの範囲は下記のように指定することができます。

file_name = 'data.csv'
df = pd.read_csv(file_name)

data_x = df[df.columns[0]]
data_y = df[df.columns[1]]

fig, ax = plt.subplots()

ax.plot(data_x, data_y, linestyle='solid', marker='o')

ax.set_xlabel(df.columns[0])
ax.set_ylabel(df.columns[1])

ax.set_xlim(0, 40)
ax.set_ylim(-100, 100)

plt.show()

image.png

まとめ

今後も気になる使い方が出てきた場合には追記していこうと思います。

Profile

Hotaru

メーカーで組み込み系のソフトウェアやファームウェアの開発をしています。

仕事では主にC言語、Python、C#を使っています。 ...もっと見る