从@ agstudy大量举债之拟议你链接的问题解决方案到,我们可以创建一个自定义轴功能。我们通过
element_grob.element_custom <- function(element, x ,...) {
cat <- list(...)[[1]]
groups <- levels(element$categories)
ll <- split(element$levels, element$categories)
tt <- as.numeric(x)
group.pos <- sapply(groups, function(g) mean(range(tt[ cat %in% ll[[g]] ])))
tg <- textGrob(groups, x=unit(group.pos, 'native'))
gTree(children=gList(tg), cl = "custom_axis")
}
axis.groups = function(levels, categories) {
stopifnot(is.factor(levels) & is.factor(categories))
structure(
list(categories=categories, levels=levels),
class = c("element_custom","element_blank")
)
}
grobHeight.custom_axis <-
heightDetails.custom_axis = function(x, ...)
unit(1, "lines")
这些函数共同定义自定义轴的属性。然后,让我们使用您的示例数据
dat1 <- structure(list(GROUP = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 1L, 2L), .Label = c("A", "B"), class = "factor"), id = structure(c(17L,
1L, 1L, 4L, 4L, 1L, 7L, 13L, 4L, 15L), .Label = c("G1", "G2",
"G3", "G4", "G5", "G6", "G7", "G8", "G9", "G10", "G11", "G12",
"G13", "G14", "G15", "G16", "G17"), class = "factor"), variable = structure(c(1L,
3L, 2L, 2L, 3L, 4L, 2L, 2L, 4L, 4L), .Label = c("P1", "P2", "P3",
"P4"), class = "factor"), value = c(0.002, 0.002, 0.003, 0.003,
0.003, 0.003, 0.004, 0.004, 0.004, 0.004)), .Names = c("GROUP",
"id", "variable", "value"), row.names = c(NA, -10L), class = "data.frame")
现在,我们称之为自定义函数。函数axis.groups
有两个参数,首先是每个单独条的名称,然后是每个组所属的类别。
现在,我们得出的情节
ggplot(data=dat1, aes(x=id, y=value, fill=variable))+
geom_bar(stat="identity", width=1)+
scale_y_continuous(expand = c(0,0))+
scale_fill_brewer(palette="Set1") +
xlab(" ")+ylab(" ") +
panel +
theme(axis.text.x = axis.groups(un$id, un$GROUP))
和结果
您将要确保你的级别由“集团”进行排序比“ID”,因为标签将会出现在条的中央,因此您不希望组重叠
如果每个组中总是有奇数,则t你也可以做
gb<-tapply(as.numeric(dat1$id), dat1$GROUP,
function(x) levels(dat1$id[])[floor(median(x))])
ggplot(data=dat1, aes(x=id, y=value, fill=variable))+
geom_bar(stat="identity", width=1)+
scale_y_continuous(expand = c(0,0))+
scale_fill_brewer(palette="Set1") +
panel +
xlab("")+ylab("") +
scale_x_discrete(breaks=gb, labels=names(gb))
这需要少得多的工作。这次标签不一定会在中间,它直接在中间的一个酒吧下方(或者如果酒吧中有一些酒吧的话就在酒吧的左边)
这对我来说并不是很清楚正是你想要实现的。 “A”/“B”标签代替“G1”,“G2”等?请详细说明。 – tonytonov
@tonytonov:是的,A/B独特的标签,而不是“G1”,“G2” – ramesh
检查http://stackoverflow.com/questions/18165863/ggplot2-labels-of-grouping-values-below你提供的情节答案。 –