17
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

matplotlibの基本的なグラフ設定を列挙〜散布図と連続曲線〜

Last updated at Posted at 2018-12-08

はじめに

pythonでグラフを作成するときの定番はmatplotlibですが、設定項目が多いのでいちいち調べて使うのは大変です。
基本の使用方法を列挙して、すぐに使えるようにしておこうと思います。

参考

環境

  • Google colab
  • matplotlib==3.0.2

手順

散布図

まずは基本の散布図。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first')
  # これはplt.plot(x, y, marker='o', label='first', linestyle='')と同じ。

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend() # 凡例の表示
キャプチャ.PNG

plt.plot(x, y, marker='o', label='first', linestyle='')は、線を引かずに、各点のマーカーのみ表示するという意味になります。

軸のアスペクト比を1:1にする

plt.axis('equal') で軸のアスペクト比を1:1にできます。その他座標軸の設定はmatplotlibで座標軸を調整するにあります。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first')
# plt.plot(x, y, marker='o', label='first', linestyle='')

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend() # 凡例の表示
plt.axis('equal') # x軸とy軸の比を等しくする
キャプチャ14.PNG

軸の範囲、最小単位、軸の文字サイズ、軸のラベルサイズを変更

軸の範囲はplt.xlimplt.ylim、最小単位はplt.xticksplt.yticks、文字を表示するものは大体引数にfontsizeがあります。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first')
  # これはplt.plot(x, y, marker='o', label='first', linestyle='')と同じ。

plt.title('title', fontsize=20) # タイトル
plt.xlabel('x-axis label', fontsize=15) # x軸のラベル
plt.ylabel('y-axis label', fontsize=15) # y軸のラベル
plt.xlim([-10,10]) # x軸の範囲
plt.ylim([-10,10]) # y軸の範囲
plt.xticks(np.arange(-10, 11, 1), fontsize=7) # x軸の最小単位
plt.yticks(np.arange(-10, 11, 1), fontsize=7) # y軸の最小単位

plt.grid(True) # gridの表示
plt.legend() # 凡例の表示
キャプチャ9.PNG

軸をlogスケールにする

xscaleyscaleで軸のスケールを変えられます。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.random.randn(100)
y = np.exp(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first')
  # これはplt.plot(x, y, marker='o', label='first', linestyle='')と同じ。

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル
plt.yscale('log') # y軸のスケールをlogにする

plt.grid(True) # gridの表示
plt.legend() # 凡例の表示
キャプチャ10.PNG

グラフを重ねる

複数グラフを重ねるときはplt.plot()を複数にします。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first') 
plt.plot(x, x+y, 'o', label='second') 

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
キャプチャ2.PNG

透過と色

alphaで透過度を、colorで色を指定できます。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.random.randn(100)
y = np.sin(x) + np.random.randn(100)

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, 'o', label='first', alpha=0.2, color='r')

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル


plt.grid(True) # gridの表示
plt.legend()
キャプチャ3.PNG

色の指定は次の通りです。

character color
'b' blue
'g' green
'r' red
'c' cyan
'm' magenta
'y' yellow
'k' black
'w' white

連続曲線

linestyleを指定すると線の形状を変えられます。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.linspace(0, 10, 100)
y = np.sin(x) 

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-', label='first')
# plt.plot(x, y, label='first', linestyle='-') # でも同じ

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
キャプチャ4.PNG

第3引数はlinestylemarkerを勝手に判別してくれるようです。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.linspace(0, 10, 100)
y = np.sin(x) 

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-o', label='first') 
# plt.plot(x, y, marker='o', label='first', linestyle='-') # でも同じ

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend(['new label'], loc='lower right')
キャプチャ5.PNG

plt.legend()に配列を渡すとラベルを変えられます。locで表示位置を決められます。

線の太さとマーカーの大きさはlinewidthmarkersizeで決められます。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.linspace(0, 10, 100)
y = np.sin(x) 

# グラフの大きさ指定
plt.figure(figsize=(5, 5))

# グラフの描写
plt.plot(x, y, '-o', label='first', linewidth=0.1, markersize=8) 

plt.title('title') # タイトル
plt.xlabel('x-axis label') # x軸のラベル
plt.ylabel('y-axis label') # y軸のラベル

plt.grid(True) # gridの表示
plt.legend()
キャプチャ6.PNG

linestyleは下記が使用できます。

character description
'-' solid line style
'--' dashed line style
'-.' dash-dot line style
':' dotted line style

markerは下記が使用できます。(colabだと表示されないものがいくつかあるようです)
matplotlib で使える marker を全て試してみる-pythonでグラフが見られます。

character description 備考
'.' point marker
',' pixel marker
'o' circle marker
'v' triangle_down marker
'^' triangle_up marker
'<' triangle_left marker
'>' triangle_right marker
'1' tri_down marker colabだと表示されない
'2' tri_up marker colabだと表示されない
'3' tri_left marker colabだと表示されない
'4' tri_right marker colabだと表示されない
's' square marker
'p' pentagon marker
'*' star marker
'h' hexagon1 marker
'H' hexagon2 marker
'+' plus marker colabだと表示されない
'x' x marker colabだと表示されない
'D' diamond marker
'd' thin_diamond marker
バーティカルバー vline marker colabだと表示されない
'_' hline marker colabだと表示されない

グラフを複数表示する

subplotsを使用します。subplotsfigと'ax'を戻り値として返します。axは配列で、subplots(n,m)で決めた(n,m)の位置のグラフを作成するのに使用します。
plt.plotとは軸ラベルやタイトルの設定の仕方が微妙に異なるので注意が必要です。

1行にグラフを3つ表示する場合。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.linspace(0, 10, 100)
y = []
y.append(np.sin(x))
y.append(np.cos(x))
y.append(np.tan(x))

# タイトルを配列に格納
title=['title1','title2','title3']

# 3つのグラフを配置する枠をつくる 
# figが3つのグラフが入る全体の枠で、axがそれぞれのグラフ
fig,ax = plt.subplots(1,3,figsize=(18,5))

# グラフ間の幅を調整
plt.subplots_adjust(wspace=0.4, hspace=0.3)

# グラフを作る
for i in range(3):
    ax[i].plot(x, y[i], '-')
    ax[i].set_title(title[i]) # タイトル
    ax[i].set_xlabel('x-axis label') # x軸のラベル
    ax[i].set_ylabel('y-axis label') # y軸のラベル
plt.show()
キャプチャ7.PNG

2行3列のグラフをつくります。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.linspace(0, 10, 100)
y = [[[] for i in range(3)] for i in range(2) ]
y[0][0] = np.sin(x) + np.random.randn(100)
y[0][1] = np.sin(x)
y[0][2] = np.cos(x)
y[1][0] = x**2
y[1][1] = np.log(x+1)
y[1][2] = np.exp(x)

names=['1','2','3']
fig,ax=plt.subplots(2,3,figsize=[10,5])
plt.subplots_adjust(wspace=0.6, hspace=0.6)
for i in range(2):
    for j in range(3):
        ax[i,j].plot(x,y[i][j])
        ax[i,j].set_xlabel('x-axis label') # x軸のラベル
        ax[i,j].set_ylabel('y-axis label') # x軸のラベル
        ax[i,j].set_title('%s-%s'%(names[i],names[j]))
plt.show()
キャプチャ11.PNG

レイアウトの詳細はmatplotlib基礎 | figureやaxesでのグラフのレイアウトがわかりやすいです。

軸を揃える場合はshareyを使います。rowcolallで行ごと、列ごと、全てのグラフで軸を揃えることができます。

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as random
random.seed(0) # シード値の固定

x = np.linspace(0, 10, 100)
y = [[[] for i in range(3)] for i in range(2) ]
y[0][0] = np.sin(x) + np.random.randn(100)
y[0][1] = np.sin(x)
y[0][2] = np.cos(x)
y[1][0] = x**2
y[1][1] = np.log(x+1)
y[1][2] = np.exp(x)


names=['1','2','3']
fig,ax=plt.subplots(2, 3, figsize=[10,5], sharey='row')
plt.subplots_adjust(wspace=0.6, hspace=0.6)
for i in range(2):
    for j in range(3):
        ax[i,j].plot(x,y[i][j])
        ax[i,j].set_xlabel('x-axis label') # x軸のラベル
        ax[i,j].set_ylabel('y-axis label') # x軸のラベル
        ax[i,j].set_title('%s-%s'%(names[i],names[j]))
plt.show()
キャプチャ13.PNG

グラフ1個でもsubplotsは使えます。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
キャプチャ12.PNG
17
11
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
17
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?