複数の座標系 (Axes object) を配置したとき、軸の目盛ラベルが重なってしまうことがある。 このような場合は、y軸やx軸の目盛ラベルを共有して見やすくできる。
# sample code 8-1-1
# share x-axis
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)
y2 = np.sin(x * 2)
fig, ax = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
ax[0].plot(x, y)
ax[1].scatter(x, y2)
plt.show()
# sample code 8-1-2
# share x-axis
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)
y2 = np.sin(x) * 2
fig, ax = plt.subplots(1, 2, figsize=(8, 6), sharey=True)
ax[0].plot(x, y)
ax[1].scatter(x, y2)
plt.show()
# sample code 8-1-3
# share x-axis and y-axis
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)
y2 = np.sin(x) * 2
y3 = np.cos(x)
y4 = np.cos(x) * 2
fig, ax = plt.subplots(2, 2, figsize=(8, 6), sharex=True, sharey=True)
ax[0][0].plot(x, y)
ax[0][1].plot(x, y2)
ax[1][0].plot(x, y3)
ax[1][1].plot(x, y4)
plt.show()
軸のスケールが異なるAxes の間で軸を共有すると、スケールの大きい方の軸が採用されるため、一方が小さく表示されてしまう問題がおきる。 このような場合は、軸の共有範囲を制限する。
# sample code 8-2-1
# share x-axis for each row
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)
y2 = np.sin(x) * 2
y3 = np.cos(x)
y4 = np.cos(x) * 2
fig, ax = plt.subplots(2, 2, figsize=(8, 6), sharex='col', sharey='col')
ax[0][0].plot(x, y)
ax[0][1].plot(x, y2)
ax[1][0].plot(x, y3)
ax[1][1].plot(x, y4)
plt.show()
# sample code 8-2-1
# share x-axis for each row
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 200)
x2 = np.linspace(0, 4*np.pi, 400)
y = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x2)
y4 = np.cos(x2)
fig, ax = plt.subplots(2, 2, figsize=(8, 6), sharex='row', sharey='row')
ax[0][0].plot(x, y)
ax[0][1].plot(x, y2)
ax[1][0].plot(x2, y3)
ax[1][1].plot(x2, y4)
plt.show()
グラフをプロットする場合、指定された領域に描画されるので、x軸とy軸のスケールが同じであっても、縦長や横長に表示されることがある。x軸とy軸を同じスケールで表示するメソッドが用意されている。
# sample code 8-3-1
# まずは、axis も set_aspect も指定せずに描画してみる
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
theta = np.linspace(0, 2 * np.pi, 200)
x = 3 * np.cos(theta)
y = 3 * np.sin(theta)
fig, ax = plt.subplots(1, 1, figsize=(8,6))
ax.plot(x,y)
plt.show()
# sample code 8-3-3
# axis('equal') を指定する
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
theta = np.linspace(0, 2 * np.pi, 200)
x = 3 * np.cos(theta)
y = 3 * np.sin(theta)
fig, ax = plt.subplots(1, 1, figsize=(8,6))
ax.plot(x,y)
ax.axis('equal')
plt.show()
# sample code 8-3-3
# x軸とy軸の比率を同じにする方法
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
theta = np.linspace(0, 2 * np.pi, 200)
x = 3 * np.cos(theta)
y = 3 * np.sin(theta)
fig, axs = plt.subplots(2,3,figsize=(8,8)) # 2行x3列
# axis() で'square'(正方形のボックスになるようにscaling)を指定する
axs[0][0].plot(x,y)
axs[0][0].axis('square')
axs[0][0].set_title('axis(square)',fontsize=10)
# axis()で'equal'(ボックスのサイズを変えずにスケーリング)を指定する
axs[0][1].plot(x, y)
axs[0][1].axis('equal')
axs[0][1].set_title('axis(equal)',fontsize=10)
# axis()で'scaled'(ボックスのサイズを変更してスケーリング)を指定する
axs[0][2].plot(x, y)
axs[0][2].axis('scaled')
axs[0][2].axis([-3,3,-3,3])
axs[0][2].set_title('axis(scaled)',fontsize=10)
# set_aspect()で'equal','box'(ボックスのサイズを変更してスケーリング)を指定する
axs[1][0].plot(x, y)
axs[1][0].set_aspect('equal','box')
axs[1][0].set_title('set_aspect(equal,box)',fontsize=10)
# set_aspect()で'equal','datalim'(ボックスのサイズを変更しないでスケーリング)を指定する
axs[1][1].plot(x, y)
axs[1][1].set_aspect('equal','datalim')
axs[1][1].set_title('set_aspect(equal,datalim)',fontsize=10)
# set_aspect()でaspect=1(x軸とy軸の比率を1:1にする)を指定する
axs[1][2].plot(x, y)
axs[1][2].set_aspect(aspect=1)
axs[1][2].set_title('set_aspect(aspect=1)',fontsize=10)
plt.show()
x軸やy軸のスケーリングはデフォルトでは 'linear' だが、 これを 'log', 'semilog', 'symlog', 'logit' などに変更することができる。
対数スケーリングに変更してみる。
x = np.arange(10)
print(x)
[0 1 2 3 4 5 6 7 8 9]
# sample code 8-4
# y軸をlinear, log, symlog, logit でスケーリングする
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 10.1)
y = np.exp(x)
x2 = np.arange(0.1, 200, 0.1)
y2 = np.log(x2)
fig, ax = plt.subplots(2, 2, figsize=(8,8))
# linear
ax[0][0].plot(x, y)
ax[0][0].set_title('linear')
ax[0][0].grid(True)
# log
ax[0][1].plot(x, y)
ax[0][1].set_yscale('log')
ax[0][1].set_title('yscale(log)')
ax[0][1].grid(True)
# linear
ax[1][0].plot(x2, y2)
ax[1][0].set_title('linear')
ax[1][0].grid(True)
# log
ax[1][1].plot(x2, y2)
ax[1][1].set_xscale('log')
ax[1][1].set_title('xscale(log)')
ax[1][1].grid(True)
plt.show()
スケールの異なる2つのデータを描画して、それぞれ比較したい場合がある。この場合は、異なるスケールのy軸(Axesオブジェクト)を反対側(右)に追加で配置する。
# sample code 8-5-1
# スケールの異なるデータを共通のy軸で表示するとうまく表現できない
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0.01, 10.0, 0.01)
y1 = np.exp(x)
y2 = np.sin(x)
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
ax.plot(x, y1, color='blue')
ax.plot(x, y2, color='green')
plt.show()
# sample code 8-5-2
# スケールの異なるデータを左右のy軸で表示する
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0.01, 10.0, 0.01)
y1 = np.exp(x)
y2 = np.sin(x)
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
ax.plot(x, y1, color='blue')
ax.set_xlabel('x')
ax.set_ylabel('exp', color='blue')
ax.tick_params(axis='y', labelcolor='blue')
ax2 = ax.twinx()
ax2.plot(x, y2, color='green')
ax2.set_ylabel('sin', color='green')
ax2.tick_params(axis='y', labelcolor='green')
plt.show()