2014-07-09 126 views
2

这是我的数据帧印刷组x轴标签

> head(dat1, n=10) 
    GROUP id variable value 
B G17  P1 0.002 
A G1  P3 0.002 
A G1  P2 0.003 
A G4  P2 0.003 
A G4  P3 0.003 
A G1  P4 0.003 
A G7  P2 0.004 
B G13  P2 0.004 
A G4  P4 0.004 
B G15  P4 0.004 

现在,绘制数据

panel<-theme(panel.background = element_rect(fill = "transparent",colour = NA), panel.grid.minor = element_blank(), panel.grid.major = element_blank(), 
      plot.background = element_rect(fill = "transparent",colour = NA)) 
p<-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") 
q<-p+panel+xlab(" ")+ylab(" ") 
q 

和图形是, plot

现在,我想用我的第一列中的常用组标签替换x轴标签。
这种类型的问题已经在这里回答:Multirow axis labels with nested grouping variables 但我的问题是不同的,因为我正在使用堆积图。
请帮忙!

+0

这对我来说并不是很清楚正是你想要实现的。 “A”/“B”标签代替“G1”,“G2”等?请详细说明。 – tonytonov

+0

@tonytonov:是的,A/B独特的标签,而不是“G1”,“G2” – ramesh

+0

检查http://stackoverflow.com/questions/18165863/ggplot2-labels-of-grouping-values-below你提供的情节答案。 –

回答

2

只需添加一个手动X比例:

q + scale_x_discrete(breaks = dat1$id, labels = dat1$GROUP) 

编辑:可能是一个更好的选择是使用方面:

q + facet_grid(. ~ GROUP, scales = "free") 
+0

是的,它用“A”和“B”等代替“G1”,“G2”等。如何只打印唯一的标签。例如,如果前10个是A,那么我喜欢仅为所有10个条打印一个共同的“A”。 – ramesh

+0

@ramesh在这种情况下,添加比例并不容易。将面对工作?看我的编辑。 – tonytonov

+0

不,我不想使用'facet_grid()'。雅,我知道,这将是非常困难的,但探索的选择!在这里,他们回答了http://stackoverflow.com/questions/18165863/ggplot2-labels-of-grouping-values-below-the-plot,但我无法重现我的数据。 – ramesh

3

从@ 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)) 

和结果

enter image description here

您将要确保你的级别由“集团”进行排序比“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)) 

这需要少得多的工作。这次标签不一定会在中间,它直接在中间的一个酒吧下方(或者如果酒吧中有一些酒吧的话就在酒吧的左边)

+0

优秀的解决方案!我喜欢第二个,非常好主意。 – ramesh