我无法尽全力使我对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")
这将按正确的顺序绘制所有内容(如数据框中所示),但是,我想使用而不是数字 id 沿x轴> name 作为一个组:前三个值用“ A”表示,后两个值用“ B”表示,后两个值用“ C”表示,最终值用“ D”表示-如果是全称,则使用专有名称数据集。
我觉得这应该很容易,只要我的数据帧格式正确即可。任何帮助,不胜感激。
答案 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)
如果每个组只需要一个标签,则可以执行以下操作将标签保留在每个组的第一栏中。
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())
或使用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')
答案 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))))