使用Plotly制作百分比堆叠条形图

3

我有一个像下面这样的数据集

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 

我需要一个像下面这样的百分比堆叠柱状图 What I need 我尝试了以下代码,但所需的输出未以百分比堆叠柱状图形式出现。
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")

目前我得到的就是这样 What I currently get

我在R的plotly包中找不到任何关于这种类型图表的答案。请问有人可以帮助我吗?


1
请参考plotly book中2.24图。您是否尝试阅读文档?另外,请注意您在plotly中使用的列在您提供的数据中不存在。请添加实际数据的“dput”。 - dww
2个回答

4
以下代码可以生成您所描述的图形,悬停文本中显示每个城市中类型(成人/儿童/婴儿)的总数(如果您还希望在图形本身上显示它,可以尝试添加注释) 。
  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") 

1

由于您想要在“城市”而不是“房屋单位ID”上进行堆叠百分比条形图,因此有两件事情可以做。一种方法是使用您现在拥有的比例,并创建一个组合的堆叠和分组条形图,其中您将按House_Unit_Id进行堆叠并按City进行分组。目前,我认为plotly包(如果我错了,请纠正我)无法实现这一点。您可以使用ggplot来完成这个任务。

但是,如果您真的只想比较各城市之间的百分比,请使用以下方式聚合Adult、Child和Baby中的计数:

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

然后按城市计算比例。之后,您可以为每个城市绘制百分比堆积条形图。
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")

这将起作用,如果您按城市聚合您的数量数据,并为每个城市计算比例。

@useR- 你好,如果我的示例数据令人困惑,我很抱歉,我已经进行了更详细的编辑。我真正需要的是为每个家庭计算成人、儿童和婴儿的比例(这就是为什么按行总计为100)。现在,我需要一个城市间百分比堆叠条形图来进行比较。 - Jessie
@Jessie 好的。你在问题中遗漏了非常重要的信息“House_Unit_Id”。 - acylam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接