R中的群集堆积条形图

时间:2019-12-19 20:36:31

标签: r ggplot2 plotly bar-chart data-visualization

是否有一种方法可以在R中制作成簇的堆积条形图?

目前,我有2个堆叠的条形图,如下所示:
(很抱歉,链接尚无法发布图像到问题中)
Stacked bar chart 1
Stacked bar chart 2

我的数据看起来像这样:

|state|A1|B1|C1|D1|E1|A2|B2|C2|D2  
|AL|  | 3| 2| 4|12| 2| 2| 8| 1| 6|
|AK|  | 2| 4|22| 6| 4| 4|12| 2| 3|
|AZ|  | 2| 1| 5| 5|45| 6| 2| 4|95|
|CA|  | 3| 9|11| 3|12| 7| 1| 5|25|

使用此数据,是否有一种方法可以使聚类的条形图聚在一起,以便每个状态的第二个值紧挨着第一个值?

到目前为止,我已经使用plotly制作了这些图形,我的代码如下所示:

p1 <- plot_ly(data=df, x = ~state, y = ~E1, type = 'bar', name = 'E1') %>%
  add_trace(y = ~D1, name = 'D1') %>%
  add_trace(y = ~C1, name = 'C1') %>%
  add_trace(y = ~B1, name = 'B1') %>%
  add_trace(y = ~A1, name = 'A1') %>%
  layout(yaxis = list(title = ''), barmode = 'stack')
p1

编辑: 我希望最终的图形看起来像这样:Chart Example
但是对于美国的每个州

1 个答案:

答案 0 :(得分:0)

您有两个组变量ABCD和1,2,因此更长的数据表可能更适合与ggplot2一起使用。例如,对于每个状态,您都有4 * 2 = 8个“观测”。

这是使用tidyr::pivot_longer将数据帧转换为更长格式并使用ggplot2绘制2组条形图的代码。

library(dplyr)
library(tidyr)
library(ggplot2)

df =data.table::fread(
"
|state|A1|B1|C1|D1|E1|A2|B2|C2|D2|
|AL   | 3| 2| 4|12| 2| 2| 8| 1| 6|
|AK   | 2| 4|22| 6| 4| 4|12| 2| 3|
|AZ   | 2| 1| 5| 5|45| 6| 2| 4|95|
|CA   | 3| 9|11| 3|12| 7| 1| 5|25|
"
)

df1 = df %>% 
  select(state, A1,B1,C1,D1,E1) %>% 
  pivot_longer(ends_with("1"))
df2 = df %>% 
  select(state, A2,B2,C2,D2) %>% 
  pivot_longer(ends_with("2")) 

dfall = rbind(df1,df2)%>% 
  mutate(group1= substr(name,1,1),
         group2= substr(name,2,2))

ggplot(dfall, aes(x=state,y = value, fill=group1, group=group2)) +
  geom_col(position = "dodge")

reprex package(v0.3.0.9000)于2019-12-20创建