![](/img/trans.png)
[英]How to plot x-axis labels and bars between tick marks in ggplot2 bar plot?
[英]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.