2015-07-26 3 views
0

Nouveauté en programmation et en première publication. J'essaye de créer un diagramme de bulle empilé pour montrer comment une population se décompose dans ses proportions. Mon but est d'écrire ceci en tant que fonction pour que je puisse l'utiliser facilement de façon répétée, mais j'ai besoin de trier la viande du code avant de la mettre en fonction.Diagramme à bulles empilées, "aligné en bas"

C'est le type de tracé que je voudrais: enter image description here

Ceci est le code que je l'ai essayé jusqu'à présent:

library(ggplot2) 

# some data 
observations = c(850, 500, 200, 50) 
plot_data = data.frame(
        "x"   = rep.int(1,length(observations)) 
        ,"y"   = rep.int(1,length(observations)) 
        , "size"  = rep.int(1,length(observations)) 
        ,"colour" = c(1:length(observations)) 
        ) 

# convert to percentage for relative sizes 
for (i in 1:length(observations)) 
       { 
       plot_data$size[i] = (observations[i]/max(observations))*100 
       } 

ggplot(plot_data,aes(x = x, y = y)) + 
    geom_point(aes(size = size, color = colour)) + 
    scale_size_identity() + 
    scale_y_continuous (limits = c(0.5, 1.5)) + 
    theme(legend.position = "none")  

Cela produit une image de type Bullseye. Mon approche a consisté à essayer de calculer comment les rayons circulaires sont calculés, puis à mettre à jour la valeur y dans la boucle for pour chaque entrée de sorte que tous les cercles touchent à la base - c'est là que j'ai échoué .

Donc, ma question: Comment puis-je savoir ce que les coordonnées y pour chaque cercle doit être?

Nous vous remercions de votre aide et de vos conseils.

+0

est une exigence ggplo2? c'est assez facile avec 'plotrix :: draw.circle' – hrbrmstr

+0

Dupe possible de http://stackoverflow.com/questions/24738172/bubble-chart-in-r – Henrik

+1

Également pertinent: http://stackoverflow.com/questions/ 14826815/comment-à-bulle-graphique-aligné-bas-et-coller-à-l'autre – Henrik

Répondre

0

Je pense que cela simplifie la réponse que Henrick trouvée:

circle <- function(center, radius, group) { 
    th <- seq(0, 2*pi, len=200) 
    data.frame(group=group, 
      x=center[1] + radius*cos(th), 
      y=center[2] + radius*sin(th)) 
} 

# Create a named vector for your values 
obs <- c(Org1=500, Org2=850, Org3=50, Org4=200) 

# this reverse sorts them (so the stacked layered circles work) 
# and makes it a list 
obs <- as.list(rev(sort(obs))) 

# need the radii 
rads <- lapply(obs, "/", 2) 

# need the max 
x <- max(sapply(rads, "[")) 

# build a data frame of created circles 
do.call(rbind.data.frame, lapply(1:length(rads), function(i) { 
    circle(c(x, rads[[i]]), rads[[i]], names(rads[i])) 
})) -> dat 

# make the plot 

gg <- ggplot(dat) 
gg <- gg + geom_polygon(aes(x=x, y=y, group=group, fill=group), 
         color="black") 
gg <- gg + coord_equal() 
gg <- gg + ggthemes::theme_map() 
gg <- gg + theme(legend.position="right") 
gg 

enter image description here

Vous pouvez modifier les guides/couleurs avec des fonctions standard ggplot.

+0

fantastique, merci pour toute l'aide! –

+0

si ce code fonctionne pour vous, il aide les autres à le trouver si vous cochez la case «accepter». – hrbrmstr