2015-04-07 1 views
0

J'ai écrit un code pour tracer des données de densité pour les variations d'un test A/B. Je voudrais améliorer le visuel en ombrant (avec le remplissage étant légèrement transparent) la zone en dessous de chaque courbe. J'utilise actuellement matplot, mais comprendre ggplot pourrait être une meilleure option.r tracé de densité - aire de remplissage sous courbe

Des idées? Merci.

# Setup data frame - these are results from an A/B experiment 
conv_data = data.frame(
      VarNames = c("Variation 1", "Variation 2", "Variation 3") # Set variation names 
      ,NumSuccess = c(1,90,899) # Set number of successes/conversions 
      ,NumTrials = c(10,100,1070) # Set number of trials 
      ) 
conv_data$NumFailures = conv_data$NumTrials - conv_data$NumSuccess # Set number of failures [no conversions] 
num_var = NROW(conv_data) # Set total number of variations 
plot_col = rainbow(num_var) # Set plot colors 

get_density_data <- function(n_var, s, f) { 
    x = seq(0,1,length.out=100) # 0.01,0.02,0.03...1 
    dens_data = matrix(data = NA, nrow=length(x), ncol=(n_var+1)) 
    dens_data[,1] = x 

    # set density data 
    for(j in 1:n_var) { 
     # +1 to s[], f[] to ensure uniform prior 
     dens_data[,j+1] = dbeta(x, s[j]+1, f[j]+1) 
    } 
    return(dens_data) 
} 

density_data = get_density_data(num_var, conv_data$NumSuccess, conv_data$NumFailures) 

matplot(density_data[,1]*100, density_data[,-1], type = "l", lty = 1, col = plot_col, ylab = "Probability Density", xlab = "Conversion Rate %", yaxt = "n") 
legend("topleft", col=plot_col, legend = conv_data$VarNames, lwd = 1) 

Ce produit le tracé suivant: enter image description here

+0

J'ai écrit un [blog sur les régions d'ombrage sous une courbe] (http://www.fromthebottomoftheheap.net/2013/01/11/shading-r egions-under-a-curve /) comme ça. Dans votre cas, vous voulez remplir toute la région afin de le simplifier un peu. Essentiellement, vous voulez utiliser 'polygon()' pour dessiner la zone ombrée, puis peut-être dessiner les lignes sur le dessus. Si j'ai de la chance et que personne n'y a répondu avant que je rentre à la maison, je fournirai une réponse appropriée. –

+0

Gavin, super blog. J'ai répondu à ma propre question en passant à ggplot, mais votre message a également répondu à ma question par un autre moyen. Si vous postez comme réponse, je marquerai votre réponse acceptée. – cometrico

Répondre

1
# Setup data frame - these are results from an A/B experiment 
conv_data = data.frame(
    VarNames = c("Variation 1", "Variation 2", "Variation 3") # Set variation names 
    ,NumSuccess = c(1,90,899) # Set number of successes/conversions 
    ,NumTrials = c(10,100,1070) # Set number of trials 
) 
conv_data$NumFailures = conv_data$NumTrials - conv_data$NumSuccess # Set number of failures [no conversions] 
num_var = NROW(conv_data) # Set total number of variations 
plot_col = rainbow(num_var) # Set plot colors 

get_density_data <- function(n_var, s, f) { 
    x = seq(0,1,length.out=100) # 0.01,0.02,0.03...1 
    dens_data = matrix(data = NA, nrow=length(x), ncol=(n_var+1)) 
    dens_data[,1] = x 

    # set density data 
    for(j in 1:n_var) { 
    # +1 to s[], f[] to ensure uniform prior 
    dens_data[,j+1] = dbeta(x, s[j]+1, f[j]+1) 
    } 
    return(dens_data) 
} 

density_data = get_density_data(num_var, conv_data$NumSuccess, conv_data$NumFailures) 

matplot(density_data[,1]*100, density_data[,-1], type = "l", 
     lty = 1, col = plot_col, ylab = "Probability Density", 
     xlab = "Conversion Rate %", yaxt = "n") 
legend("topleft", col=plot_col, legend = conv_data$VarNames, lwd = 1) 

## and add this part 
for (ii in seq_along(plot_col)) 
    polygon(c(density_data[, 1] * 100, rev(density_data[, 1] * 100)), 
      c(density_data[, ii + 1], rep(0, nrow(density_data))), 
      col = adjustcolor(plot_col[ii], alpha.f = .25)) 

enter image description here

+0

Exactement ce que je cherchais, merci. – cometrico

0

a été en mesure de répondre propre question:

df = as.data.frame(t(conversion_data)) 
dfs = stack(df) 
ggplot(dfs, aes(x=values)) + geom_density(aes(group=ind, colour=ind, fill=ind), alpha=0.3) 
+0

ouais mais vous n'avez pas posté 'conversion_data' – rawr