Python
matplotlib

バイオリンプロットの本当の描き方を見せてやる

「バイオリンプロット」の本当の描き方を簡単ですが以下に示します。

%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()

output_2_0.png

次に、少し小さめの丸いマーカーで、少しだけ位置をずらしてプロットします。

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()

output_3_0.png

次に、小さい丸を使って、位置を微調整しながらプロットします。このとき、白などの背景色を選ぶのがポイントです。

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()

output_4_0.png

同じ大きさの小さい丸で、位置を微調整しながらプロットします。これで胴体のクビレができました。

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()

output_5_0.png

続いて、ネックの部分を作成します。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()

output_6_0.png

最後にペグの部分をちょいちょいと足してやれば、、、

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()

output_7_0.png

バイオリンっぽくなりましたね!!