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

#Python3+Matplotlibで数直線グラフを描く
サーストン一対比較法を用いて心理尺度実験を行った際に改めてプロットする必要があったため
Python3+Matplotlibで描画したメモ

#実行環境

+ macOS Catalina 10.15.7
+ Python 3.8.5 (default, Jul 21 2020, 10:48:26)

#ライブラリ

+ Matplotlib
+ Numpy
+ pylab
+ IPython

#全体像
```python: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で直線を表す

```python
p_size = 4 #配列のサイズ
p = np.random.random_sample(p_size) #サンプルとしてランダムに配列を生成
print(p)
p = sorted(p) #ソート
y = [0]*p_size #y=0
```

#数直線
```python
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') #タイトル
```

#数値表示
```python
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="->")
                )
```

#最小値、最大値
```python
xmin, xmax= -1,1 #数直線の最小値・最大値
```

#空白調整
```python
plt.tight_layout() #グラフの自動調整

plt.subplots_adjust(left=0, right=1, bottom=0.2, top=0.8) #微調整
```
#色、サイズ、マーカー
```python


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、マーカー：逆三角形
```

#表示調整
```python
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) #枠を消す
```

#表示
```python
plt.show() #表示
```

#実行結果

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/ba67f115-667b-039b-ead2-21b6c1cc4fdd.png)


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