「バイオリンプロット」の本当の描き方を簡単ですが以下に示します。
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.linspace(0, 2.0 * math.pi, 15)
y = np.sin(x)
まず以下のようにして、丸いマーカーを使ってプロットを描きます。
markers = []
markers.append(('o', [100, 0, 0, "black"]))
for m, s in markers:
plt.scatter(x + s[1], y + s[2], marker=m, c=s[3], color=s[3], s=s[0])
plt.show()
次に、少し小さめの丸いマーカーで、少しだけ位置をずらしてプロットします。
markers.append(('o', [60, 0.1, 0.1, "black"]))
for m, s in markers:
plt.scatter(x + s[1], y + s[2], marker=m, c=s[3], color=s[3], s=s[0])
plt.show()
次に、小さい丸を使って、位置を微調整しながらプロットします。このとき、白などの背景色を選ぶのがポイントです。
markers.append(('o', [20, 0.17, 0.03, "white"]))
for m, s in markers:
plt.scatter(x + s[1], y + s[2], marker=m, c=s[3], color=s[3], s=s[0])
plt.show()
同じ大きさの小さい丸で、位置を微調整しながらプロットします。これで胴体のクビレができました。
markers.append(('o', [20, -0.05, 0.09, "white"]))
for m, s in markers:
plt.scatter(x + s[1], y + s[2], marker=m, c=s[3], color=s[3], s=s[0])
plt.show()
続いて、ネックの部分を作成します。forとrangeを使って細かい丸をプロットすることで線を描きました。
for n in range(11):
xy = n * 0.01 + 0.14
markers.append(('o', [1, xy, xy, "black"]))
for m, s in markers:
plt.scatter(x + s[1], y + s[2], marker=m, c=s[3], color=s[3], s=s[0])
plt.show()
最後にペグの部分をちょいちょいと足してやれば、、、
markers.append(('o', [1, 0.22, 0.20, "black"]))
markers.append(('o', [1, 0.20, 0.22, "black"]))
markers.append(('o', [1, 0.24, 0.22, "black"]))
markers.append(('o', [1, 0.22, 0.24, "black"]))
for m, s in markers:
plt.scatter(x + s[1], y + s[2], marker=m, c=s[3], color=s[3], s=s[0])
plt.show()
バイオリンっぽくなりましたね!!
参考
- matplotlib で使える marker を全て試してみる
- ウニプロットをmatplotlibで描く