2015-04-21 16 views
7

Widziałem ten wspaniały boxplot w this article (Ryc. 2).Dodawanie rozrzutu punktów do boxplot za pomocą matplotlib

A wonderful boxplot

Jak widać, jest to boxplot na które nakładają się rozrzut czarnych punktów: X indeksów czarne punkty (w przypadkowej kolejności), y jest zmienną zainteresowania. Chciałbym zrobić coś podobnego za pomocą Matplotlib, ale nie mam pojęcia, od czego zacząć. Dotychczas boxplots które znalazłem w Internecie to sposób mniej chłodne i wyglądać tak:

Usual boxplots

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

sposoby kolorowania boxplots: https://github.com/jbmouret/matplotlib_for_papers#colored-boxes

+0

może być związane z: http://stackoverflow.com/q/28521828/376454 – Wok

Odpowiedz

12

Co szukasz sposobu na dodanie jittera do osi X.

Coś takiego zaczerpnięte z 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

Cytowanie link:

jeden sposób, aby dodać dodatkowe informacje do boxplot jest nakładki rzeczywiste dane; na ogół jest to najbardziej odpowiednie dla małych serii danych o małych rozmiarach lub . Gdy dane są gęste, kilka sztuczek użyte powyżej pomocą wizualizacji:

  1. obniżenie poziomu alfa, aby punkty częściowo przezroczyste
  2. dodanie losowego „drgania” wzdłuż osi X w celu uniknięcia overstriking

Kod wygląda następująco:

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

Nicea odpowiedź. Proszę rozważyć dodanie wszystkich niezbędnych importów, aby ułatwić innym powielanie kodu. – cel

3

Rozszerzając Rozwiązanie Kyrubas i użycie tylko matplotlib dla części plotowania (czasami mam problem z formatowaniem pandy 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) 

enter image description here

+0

Dla użytkowników Python 3, musisz zawinąć mapę na liście, tak jak to: ''group': list (map (np.floor, np.random.rand (n) * ngroup))' – jss367