Dodawanie punktów do boxplot za pomocą matplotlib

Widziałem ten wspaniały boxplot w Ten artykuł (rys.2).

Wspaniały boxplot

Jak widać, jest to boxplot, na którym nałożony jest rozrzut czarnych punktów: x indeksuje czarne punkty( w losowej kolejności), y jest zmienną zainteresowania. Chciałbym zrobić coś podobnego za pomocą Matplotlib, ale nie mam pojęcia od czego zacząć. Jak na razie boxploty, które znalazłem w Internecie są o wiele mniej fajne i wyglądają tak: {]}

Zwykłe pudełka

Dokumentacja matplotlib: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.boxplot

Sposoby kolorowania kartonów: https://github.com/jbmouret/matplotlib_for_papers#colored-boxes

Author: Wok, 2015-04-21

2 answers

Szukasz sposobu na dodanie jittera do osi X.

Coś takiego wzięte z tutaj :

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)

Tutaj wpisz opis obrazka

Cytując link:

Jednym ze sposobów na dodanie dodatkowych informacji do kartoteki jest nałożenie na dane rzeczywiste; jest to na ogół najbardziej odpowiednie dla małych lub seria danych średniej wielkości. Gdy dane są gęste, kilka sztuczek użyte powyżej pomagają wizualizacji:

  1. zmniejszenie poziomu alfa, aby punkty częściowo przezroczyste
  2. dodawanie losowego "jittera" wzdłuż osi x, aby uniknąć przeciążenia

Kod wygląda tak:

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()
 17
Author: Kyrubas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 09:40:33

Rozszerzenie na rozwiązanie Kyrubasa i użycie tylko matplotlib do części kreślarskiej (czasami mam trudności z formatowaniem Wykresów z 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)

Tutaj wpisz opis obrazka

 8
Author: hwang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 00:17:04