2017-09-05 2 views
1

Après the plotly directions, je voudrais tracer quelque chose de similaire au code suivant:distributions Traçage avec des longueurs inégales

import plotly.plotly as py 
import plotly.figure_factory as ff 

import numpy as np 

# Add histogram data 
x1 = np.random.randn(200) - 2 
x2 = np.random.randn(200) 
x3 = np.random.randn(200) + 2 
x4 = np.random.randn(200) + 4 


# Group data together 
hist_data = [x1, x2, x3, x4] 

group_labels = ['Group 1', 'Group 2', 'Group 3', 'Group 4'] 

# Create distplot with custom bin_size 
fig = ff.create_distplot(hist_data, group_labels, bin_size = [.1, .25, .5, 1]) 

# Plot! 
py.iplot(fig, filename = 'Distplot with Multiple Bin Sizes') 

Cependant, j'ai un vrai jeu de données mondiale qui est inégale dans la taille de l'échantillon (ie nombre du groupe 1 est différent de compter dans le groupe 2, etc.). En outre, il s'agit d'un format de paire nom-valeur.

Voici quelques données fictives pour illustrer:

# Add histogram data 
x1 = pd.DataFrame(np.random.randn(100)) 
x1['name'] = 'x1' 

x2 = pd.DataFrame(np.random.randn(200) + 1) 
x2['name'] = 'x2' 

x3 = pd.DataFrame(np.random.randn(300) - 1) 
x3['name'] = 'x3' 

df = pd.concat([x1, x2, x3]) 
df = df.reset_index(drop = True) 
df.columns = ['value', 'names'] 

df 

Comme vous pouvez le voir, chaque nom (x1, x2, x3) a un compte différent, et aussi la colonne « nom » est ce que je voudrais utiliser comme couleur.

Est-ce que quelqu'un sait comment je peux tracer cela dans l'intrigue?

FYI dans R, c'est très simple, j'appellerais simplement ggplot, et dans aes(fill = names).

Toute aide serait appréciée, merci!

Répondre

2

Vous pourriez essayer de découper votre dataframe, puis le placer dans Ploty.

fig = ff.create_distplot([df[df.names == a].value for a in df.names.unique()], df.names.unique(), bin_size=[.1, .25, .5, 1]) 

enter image description here

import plotly 
import pandas as pd 
plotly.offline.init_notebook_mode() 
x1 = pd.DataFrame(np.random.randn(100)) 
x1['name']='x1' 

x2 = pd.DataFrame(np.random.randn(200)+1) 
x2['name']='x2' 

x3 = pd.DataFrame(np.random.randn(300)-1) 
x3['name']='x3' 

df=pd.concat([x1,x2,x3]) 
df=df.reset_index(drop=True) 
df.columns = ['value','names'] 
fig = ff.create_distplot([df[df.names == a].value for a in df.names.unique()], df.names.unique(), bin_size=[.1, .25, .5, 1]) 
plotly.offline.iplot(fig, filename='Distplot with Multiple Bin Sizes') 
+0

Nous vous remercions d'une solution élégante. –

1

Le example dans la documentation de plotly fonctionne hors de la boîte pour l'échantillon inégale tailles trop:

#!/usr/bin/env python 

import plotly 
import plotly.figure_factory as ff 
plotly.offline.init_notebook_mode() 
import numpy as np 

# data with different sizes 
x1 = np.random.randn(300)-2 
x2 = np.random.randn(200) 
x3 = np.random.randn(4000)+2 
x4 = np.random.randn(50)+4 

# Group data together 
hist_data = [x1, x2, x3, x4] 

# use custom names 
group_labels = ['x1', 'x2', 'x3', 'x4'] 

# Create distplot with custom bin_size 
fig = ff.create_distplot(hist_data, group_labels, bin_size=.2) 

# change that if you don't want to plot offline 
plotly.offline.plot(fig, filename='Distplot with Multiple Datasets') 

Le script ci-dessus produira le résultat suivant:


enter image description here