如何分组ggplot geom_bar R

时间:2018-09-17 20:54:07

标签: r ggplot2

我无法尽全力使我对ggplot geom_bar进行分组。

我有一个模拟数据帧结构,尽管实际数据帧明显更大:

df<-data.frame(id=1:12,
    count=c(12,5,33,6,43,12,8,56,14,43,36,32),
    name=c("A","A","A","B","B","B","B","B","B","C","C","D"),
    stringsAsFactors=F)

使用模拟或在这种情况下使用真实数据框,我得到一个类似图

ggplot(df, aes(x=id,y=count)) + geom_bar(stat="identity")

enter image description here

这将按正确的顺序绘制所有内容(如数据框中所示),但是,我想使用而不是数字 id 沿x轴> name 作为一个组:前三个值用“ A”表示,后两个值用“ B”表示,后两个值用“ C”表示,最终值用“ D”表示-如果是全称,则使用专有名称数据集。

我觉得这应该很容易,只要我的数据帧格式正确即可。任何帮助,不胜感激。

2 个答案:

答案 0 :(得分:4)

我们可以在scale_x_discrete函数中指定标签。

library(ggplot2)

df<-data.frame(id=1:12,
               count=c(12,5,33,6,43,12,8,56,14,43,36,32),
               name=c("A","A","A","B","B","B","B","B","B","C","C","D"),
               stringsAsFactors=F)

ggplot(df, aes(x = factor(id), y = count)) + 
  geom_bar(stat="identity") +
  scale_x_discrete(name = "name", labels = df$name)

enter image description here

如果每个组只需要一个标签,则可以执行以下操作将标签保留在每个组的第一栏中。

library(dplyr)

df2 <- df %>%
  group_by(name) %>%
  mutate(name2 = ifelse(row_number() > 1, "", name)) %>%
  ungroup()

ggplot(df, aes(x = factor(id), y = count)) + 
  geom_bar(stat = "identity") +
  scale_x_discrete(name = "name", labels = df2$name2) +
  theme(axis.ticks.x = element_blank())

enter image description here

或使用facet_grid

ggplot(df, aes(x = factor(id), y = count)) + 
  geom_bar(stat = "identity") +
  scale_x_discrete(name = "id") +
  facet_grid(. ~ name, space = 'free_x', scales = 'free_x')

enter image description here

答案 1 :(得分:1)

这是一种实现方法,我们分别计算字母的位置和分隔符(为清楚起见),并使用scale_x_continuous / breaks / labels进行绘制

l <- rle(df$name)$lengths
letter_pos <- cumsum(c(0,head(l,-1))) + l/2 + .5
sep_pos <- cumsum(l) + .5

ggplot(df, aes(x=id,y=count)) + geom_bar(stat="identity") +
  scale_x_continuous(breaks = c(letter_pos, sep_pos),
                     labels = c(unique(df$name),rep("|",length(letter_pos))))