LoginSignup
2
0

More than 3 years have passed since last update.

Python3+Matplotlibで数直線グラフを描く

Last updated at Posted at 2020-12-12

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() #表示

実行結果

Figure_1.png

ちなみに、一対比較法については別の記事にまとめています。
https://zenn.dev/_kazuya/articles/a1179ed3f6e027

2
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
2
0