簡體   English   中英

在堆疊的ggplot2條形圖中打印組x軸標簽

[英]printing group x-axis labels in stacked ggplot2 bar plot

這是我的數據框

> 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

圖是 情節

現在,我想在df第一欄中用通用組標簽替換x軸標簽。
此類問題已在此處得到解答: 具有嵌套分組變量的多行軸標簽但是我的問題有所不同,因為我使用的是堆積圖。
請幫助!

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

結果

在此處輸入圖片說明

您將要確保您的級別按“ GROUP”而不是“ id”進行排序,因為標簽只會位於條形的中心,因此您不希望組重疊

如果每個組中總是有一個奇數,那么您也可以

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

這需要更少的工作。 這次標簽不必一定在中間,而是直接在中間條的下方(如果組中條數為偶數,則在標簽的左側)

只需添加一個手動x比例尺即可:

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

編輯 :可能更好的選擇是使用構面:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM