2016-11-26 12 views
0

habe ich einen Datensatz wie untenR: Prozentuale Stapelbalkendiagramm in plotly

City<-c("X","Y","Z","X","Z","X","Y") 
House_Unit_Id<-c("H1","H2","H3","H4","H5","H6","H7") 
Adult<-c(50,100,60,40,50,80,60) 
Child<-c(40,0,40,20,50,20,30) 
Baby<-c(10,0,0,40,0,0,10) 
data<-data.frame(City,House_Unit_Id,Adult,Child,Baby) 

City House_Unit_Id Adult Child Baby 
    X  H1   50  40  10 
    Y  H2  100  0  0 
    Z  H3   60  40  0 
    X  H4   40  20  40 
    Z  H5   50  50  0 
    X  H6   80  20  0 
    Y  H7   60  30  10 

Ich brauche einen Spaltenstapel-Diagramm Prozentsatz wie unten What I need

ich versuchte, den Code unten, aber die erforderliche Ausgabe ist nicht erscheint als Prozent-Stack-Balkendiagramm.

Chart <- plot_ly(data,x = ~City, y = ~Adult, type = 'bar',name= 'Adult') %>% 
    add_trace(y = ~Child, name = 'Child') %>% 
    add_trace(y = ~Baby, name = 'Baby') %>% 
    layout(yaxis = list(title = 'Percentage (%)'),barmode = "stack") 

Dies ist, was ich zur Zeit What I currently get

ich keine Antworten für diese Art von Diagramm für plotly Paket in R. mir bitte dabei helfen Kann jemand finden könnte?

+0

fig 2.24 in [plotly Buch] (https://cpsievert.github.io/plotly_book/bars-histograms.html). Haben Sie versucht, die Dokumentation zu lesen? Auch die Spalten, die Sie in plotly verwenden, sind in den von Ihnen bereitgestellten Daten nicht vorhanden. Bitte fügen Sie 'dput' von Ihren tatsächlichen Daten hinzu – dww

Antwort

1

Der folgende Code gibt Ihnen die Parzelle Sie, mit der Gesamtzahl des Typs (Erwachsene/Kinder/Baby) in jeder Stadt in der hovertext beschreiben (Wenn Sie es auch auf dem Grundstück wollen selbst Sie können add_annotations versuchen)

City<-c("X","Y","Z","X","Z","X","Y") 
    House_Unit_Id<-c("H1","H2","H3","H4","H5","H6","H7") 
    Adult<-c(50,100,60,40,50,80,60) 
    Child<-c(40,0,40,20,50,20,30) 
    Baby<-c(10,0,0,40,0,0,10) 
    data<-data.frame(City,House_Unit_Id,Adult,Child,Baby) 

    library(plyr) 
    # Changing the data frame before plotting ... there is propably an easier way to do this! 
    newdata <- ldply(3:5,function(n){tempdata <- data[,c(1,n)] 
           colnames(tempdata)[2] <- "Number" 
           tempdata$type <- colnames(data[n]) 
           return(tempdata)}) 
    newdata <- ddply(newdata,.(City,type),summarize,Number=sum(Number)) 
    # Total for each city 
    datatotal <- ddply(newdata,~City,summarize,n=sum(Number)) 
    # Merge the data frames together 
    newdata <- merge(newdata,datatotal) 
    # Calc the percentages 
    newdata$perc <- newdata$Number/newdata$n 

plot_ly(newdata,x = ~City, y = ~perc*100, type = 'bar',color = ~type,text=~Number,hoverinfo = 'text') %>% 
    layout(yaxis = list(title = 'Percentage (%)'),barmode = "stack") 
0

Da Sie gestapelte prozentuale Barplots über "City" nicht "House_Unit_Id" möchten, gibt es zwei Dinge, die Sie tun können. Verwenden Sie entweder die Proportionen, die Sie jetzt haben, und erstellen Sie eine Kombination aus gestapeltem und gruppiertem Barplot, wobei Sie nach House_Unit_Id stapeln und nach Stadt gruppieren. Momentan glaube ich nicht, dass das plotly-Paket (korrigiere mich, wenn ich falsch liege) dazu in der Lage ist. Sie können hierzu ggplot verwenden.

Allerdings, wenn Sie wirklich wollen, nur Prozentsätze über der Stadt vergleichen zu können, sollten Sie die zählt in Erwachsener, Kind und Baby mit so etwas wie dieses Aggregat:

newData = aggregate(. ~ City, data = data, FUN = sum) 

Dann werden die Proportionen von Stadt berechnen . Danach können Sie die Prozentsätze als gestapelte Balken für jede Stadt darstellen.

Chart <- plot_ly(newData, x = ~City, y = ~Adult, type = 'bar', name= 'Adult') %>% 
    add_trace(y = ~Child, name = 'Child') %>% 
    add_trace(y = ~Baby, name = 'Baby') %>% 
    layout(yaxis = list(title = 'Percentage (%)'), barmode = "stack") 

Das funktioniert, wenn Sie Ihre zählt Daten von Stadt aggregieren und die Anteile für jede Stadt berechnen.

+0

@ useR- Hallo, Sorry, wenn meine Beispieldaten verwirrend waren, die ich jetzt mit mehr Details bearbeitet habe. Was ich wirklich brauche, ist, dass ich Erwachsenen-, Kinder-, Baby-Anteil für jeden Haushalt berechnet habe (deshalb ist zeilenweise insgesamt 100). Jetzt brauche ich ein Prozent-Stack-Balkendiagramm über die Stadt zum Vergleich. – Jessie

+0

@Jessie Ok. Die "House_Unit_Id" ist also eine sehr wichtige Information, die Sie in Ihrer Frage weggelassen haben. – useR