web-dev-qa-db-ja.com

matplotlibを使用してボックスプロットに点の散布を追加する

この素晴らしい箱ひげ図を この記事 で見ました(図2)。

A wonderful boxplot

ご覧のとおり、これは黒い点の散布が重ね合わされた箱ひげ図です。xは黒い点に(ランダムな順序で)インデックスを付け、yは対象の変数です。 Matplotlibを使用して同様のことを行いたいのですが、どこから始めればよいかわかりません。これまでのところ、私がオンラインで見つけた箱ひげ図は、それほどクールではなく、次のように見えます。

Usual boxplots

Matplotlibのドキュメント: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.boxplot

ボックスプロットに色を付ける方法: https://github.com/jbmouret/matplotlib_for_papers#colored-boxes

14
Wok

探しているのは、x軸にジッターを追加する方法です。

here から取得したこのようなもの:

bp = titanic.boxplot(column='age', by='pclass', grid=False)
for i in [1,2,3]:
    y = titanic.age[titanic.pclass==i].dropna()
    # Add some random "jitter" to the x-axis
    x = np.random.normal(i, 0.04, size=len(y))
    plot(x, y, 'r.', alpha=0.2)

enter image description here

リンクを引用:

ボックスプロットに追加情報を追加する1つの方法は、実際のデータをオーバーレイすることです。これは一般に、小規模または中規模のデータ系列に最適です。データが密集している場合、上記で使用したいくつかのトリックが視覚化に役立ちます。

  1. アルファレベルを下げてポイントを部分的に透明にする
  2. x軸に沿ってランダムな「ジッター」を追加して、重ね打ちを回避する

コードは次のようになります。

import pylab as P
import numpy as np

# Define data
# Define numBoxes

P.figure()

bp = P.boxplot(data)

for i in range(numBoxes):
    y = data[i]
    x = np.random.normal(1+i, 0.04, size=len(y))
    P.plot(x, y, 'r.', alpha=0.2)

P.show()
21
Kyrubas

Kyrubasのソリューションを拡張し、プロット部分にmatplotlibのみを使用します(pandas plots with matplotlib)。

from matplotlib import cm
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# initialize dataframe
n = 200
ngroup = 3
df = pd.DataFrame({'data': np.random.Rand(n), 'group': map(np.floor, np.random.Rand(n) * ngroup)})

group = 'group'
column = 'data'
grouped = df.groupby(group)

names, vals, xs = [], [] ,[]

for i, (name, subdf) in enumerate(grouped):
    names.append(name)
    vals.append(subdf[column].tolist())
    xs.append(np.random.normal(i+1, 0.04, subdf.shape[0]))

plt.boxplot(vals, labels=names)
ngroup = len(vals)
clevels = np.linspace(0., 1., ngroup)

for x, val, clevel in Zip(xs, vals, clevels):
    plt.scatter(x, val, c=cm.prism(clevel), alpha=0.4)

enter image description here

14
hwang

より単純な、おそらく新しいオプションとして、seabornswarmplotオプションを使用できます。

import seaborn as sns
import matplotlib.pyplot as plt

sns.set(style="whitegrid")
tips = sns.load_dataset("tips")

ax = sns.boxplot(x="day", y="total_bill", data=tips, showfliers = False)
ax = sns.swarmplot(x="day", y="total_bill", data=tips, color=".25")

plt.show()

enter image description here


元の質問をもう一度見て(そして自分自身でより多くの経験を積んで)、sns.swarmplotではなくsns.stripplotの方が正確だと思います。

3
HS-nebula