복붙노트

[PYTHON] matplotlib를 사용하여 boxplot에 점 분산을 추가합니다.

PYTHON

matplotlib를 사용하여 boxplot에 점 분산을 추가합니다.

나는이 기사에서이 멋진 상자 그림을 보았다 (그림 2).

보시다시피 이것은 검은 점의 산란을 겹쳐 쌓은 박스 플롯입니다. x는 검은 점을 임의의 순서로 표시하고, y는 관심있는 변수입니다. Matplotlib을 사용하여 비슷한 것을하고 싶습니다만, 어디서부터 시작해야할지 모르겠습니다. 지금까지 내가 온라인에서 찾은 박스 플롯은 덜 시원하고 다음과 같이 보입니다.

matplotlib의 문서화 : http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.boxplot

상자 그림을 채색하는 방법 : https://github.com/jbmouret/matplotlib_for_papers#colored-boxes

해결법

  1. ==============================

    1.당신이 찾고있는 것은 x 축에 지터를 추가하는 방법입니다.

    당신이 찾고있는 것은 x 축에 지터를 추가하는 방법입니다.

    여기에서 가져온 것과 같은 것 :

    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)
    

    링크 인용 :

    코드는 다음과 같습니다.

    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()
    
  2. ==============================

    2.Kyrubas의 솔루션을 확장하고 플로팅 부분에만 matplotlib를 사용합니다 (때로는 matplotlib로 팬더 서식을 지정하는 데 어려움이 있습니다).

    Kyrubas의 솔루션을 확장하고 플로팅 부분에만 matplotlib를 사용합니다 (때로는 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)
    

  3. from https://stackoverflow.com/questions/29779079/adding-a-scatter-of-points-to-a-boxplot-using-matplotlib by cc-by-sa and MIT license