Python3+Matplotlibで数直線グラフを描く
サーストン一対比較法を用いて心理尺度実験を行った際に改めてプロットする必要があったため
Python3+Matplotlibで描画したメモ
実行環境
- macOS Catalina 10.15.7
- Python 3.8.5 (default, Jul 21 2020, 10:48:26)
ライブラリ
- Matplotlib
- Numpy
- pylab
- IPython
全体像
one_dimension.py
import numpy as np
import matplotlib.pyplot as plt
import pylab
from IPython import get_ipython
ipy = get_ipython()
if ipy is not None:
ipy.run_line_magic('matplotlib', 'inline')
# 配列を生成
p_size = 4 #配列のサイズ
p = np.random.random_sample(p_size) #サンプルとしてランダムに配列を生成
print(p)
p = sorted(p) #ソート
y = [0]*p_size #y=0
# 数直線
fig,ax=plt.subplots(figsize=(10,10)) #画像サイズ
fig.set_figheight(2.5) #高さ調整
ax.tick_params(labelbottom=True, bottom=False) #x
ax.tick_params(labelleft=False, left=False) #y
ax.set_title('Psychological Scale') #タイトル
# 数値表示
for i in range(4):
ax.annotate('{0:.2f}'.format(p[i]),
xy=(p[i],y[i]),
xytext=(10, 20),
textcoords='offset points',
arrowprops=dict(arrowstyle="->")
)
xmin, xmax= -1,1 #数直線の最小値・最大値
plt.tight_layout() #グラフの自動調整
plt.subplots_adjust(left=0, right=1, bottom=0.2, top=0.8) #微調整
plt.scatter(p[0],y[0], c='red', s=100,marker='.', label='group1') #赤、サイズ100、マーカー:ドット
plt.scatter(p[1],y[0], c='blue', s=100,marker='o', label='group2') #青、サイズ100、マーカー:丸
plt.scatter(p[2],y[0], c='green', s=100,marker='s', label='group3') #緑、サイズ100、マーカー:四角形
plt.scatter(p[3],y[0], c='orange', s=100,marker='v', label='group4') #オレンジ、サイズ100、マーカー:逆三角形
plt.hlines(y=0,xmin=xmin,xmax=xmax) #横軸
plt.vlines(x=[i for i in range(xmin,xmax+1,1)],ymin=-0.025,ymax=0.025) #目盛り線大
plt.vlines(x=[i/10 for i in range(xmin*10,xmax*10+1,1)],ymin=-0.02,ymax=0.02) #目盛り線小
plt.legend(loc='lower left') #ラベル
line_width=0.1 #目盛り数値の刻み幅
plt.xticks(np.arange(xmin,xmax+line_width,line_width)) #目盛り数値
pylab.box(False) #枠を消す
plt.show() #表示
配列を生成
今回はサンプルとしてランダムに配列を生成
yは0で直線を表す
p_size = 4 #配列のサイズ
p = np.random.random_sample(p_size) #サンプルとしてランダムに配列を生成
print(p)
p = sorted(p) #ソート
y = [0]*p_size #y=0
数直線
fig,ax=plt.subplots(figsize=(10,10)) #画像サイズ
fig.set_figheight(2.5) #高さ調整
ax.tick_params(labelbottom=True, bottom=False) #x
ax.tick_params(labelleft=False, left=False) #y
ax.set_title('Psychological Scale') #タイトル
数値表示
for i in range(4):
ax.annotate('{0:.2f}'.format(p[i]),
xy=(p[i],y[i]),
xytext=(10, 20),
textcoords='offset points',
arrowprops=dict(arrowstyle="->")
)
最小値、最大値
xmin, xmax= -1,1 #数直線の最小値・最大値
空白調整
plt.tight_layout() #グラフの自動調整
plt.subplots_adjust(left=0, right=1, bottom=0.2, top=0.8) #微調整
色、サイズ、マーカー
plt.scatter(p[0],y[0], c='red', s=100,marker='.', label='group1') #赤、サイズ100、マーカー:ドット
plt.scatter(p[1],y[0], c='blue', s=100,marker='o', label='group2') #青、サイズ100、マーカー:丸
plt.scatter(p[2],y[0], c='green', s=100,marker='s', label='group3') #緑、サイズ100、マーカー:四角形
plt.scatter(p[3],y[0], c='orange', s=100,marker='v', label='group4') #オレンジ、サイズ100、マーカー:逆三角形
表示調整
plt.hlines(y=0,xmin=xmin,xmax=xmax) #横軸
plt.vlines(x=[i for i in range(xmin,xmax+1,1)],ymin=-0.025,ymax=0.025) #目盛り線大
plt.vlines(x=[i/10 for i in range(xmin*10,xmax*10+1,1)],ymin=-0.02,ymax=0.02) #目盛り線小
plt.legend(loc='lower left') #ラベル
line_width=0.1 #目盛り数値の刻み幅
plt.xticks(np.arange(xmin,xmax+line_width,line_width)) #目盛り数値
pylab.box(False) #枠を消す
表示
plt.show() #表示
実行結果
ちなみに、一対比較法については別の記事にまとめています。
https://zenn.dev/_kazuya/articles/a1179ed3f6e027