58

を使用してドット プロットを描画する場合matplotlib、重複するデータポイントをオフセットして、それらがすべて表示されるようにしたいと考えています。たとえば、私が持っている場合:

CategoryA: 0,0,3,0,5  
CategoryB: 5,10,5,5,10  

「0」の各CategoryAデータポイントは、CategoryB.

R ( ggplot2) には、"jitter"これを行うオプションがあります。matplotlib に同様のオプションがありますか、または同様の結果につながる別のアプローチがありますか?

編集:明確にするために、 Rの"beeswarm"プロットは基本的に私が考えているものpybeeswarmであり、matplotlib/Python バージョンでの初期の便利なスタートです。

編集:バージョン 0.7 で導入された SeabornのSwarmplotは、私が望んでいたものの優れた実装です。

4

7 に答える 7

53

@ user2467675 による回答を拡張すると、次のようになります。

def rand_jitter(arr):
    stdev = .01 * (max(arr) - min(arr))
    return arr + np.random.randn(len(arr)) * stdev

def jitter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, hold=None, **kwargs):
    return scatter(rand_jitter(x), rand_jitter(y), s=s, c=c, marker=marker, cmap=cmap, norm=norm, vmin=vmin, vmax=vmax, alpha=alpha, linewidths=linewidths, **kwargs)

このstdev変数は、ジッターがさまざまなスケールで表示されるのに十分であることを確認しますが、軸の制限はゼロであり、最大値であると想定しています。

jitterの代わりに呼び出すことができますscatter

于 2014-01-22T07:40:47.633 に答える
14

numpy.random を使用して、X 軸に沿ってデータを「分散/養生」しますが、各カテゴリの固定点を中心に、基本的に各カテゴリに対して pyplot.scatter() を実行します。

import matplotlib.pyplot as plt
import numpy as np

#random data for category A, B, with B "taller"
yA, yB = np.random.randn(100), 5.0+np.random.randn(1000)

xA, xB = np.random.normal(1, 0.1, len(yA)), 
         np.random.normal(3, 0.1, len(yB))

plt.scatter(xA, yA)
plt.scatter(xB, yB)
plt.show()

X 散乱データ

于 2013-06-09T16:46:22.617 に答える
7

ここで直接的な mpl の代替案を知らないと、非常に初歩的な提案があります。

from matplotlib import pyplot as plt
from itertools import groupby

CA = [0,4,0,3,0,5]  
CB = [0,0,4,4,2,2,2,2,3,0,5]  

x = []
y = []
for indx, klass in enumerate([CA, CB]):
    klass = groupby(sorted(klass))
    for item, objt in klass:
        objt = list(objt)
        points = len(objt)
        pos = 1 + indx + (1 - points) / 50.
        for item in objt:
            x.append(pos)
            y.append(item)
            pos += 0.04

plt.plot(x, y, 'o')
plt.xlim((0,3))

plt.show()

ここに画像の説明を入力

于 2011-12-29T20:43:11.600 に答える