gpt4 book ai didi

r - 在堆叠的ggplot2条形图中打印组x轴标签

转载 作者:行者123 更新时间:2023-12-04 16:07:20 25 4
gpt4 key购买 nike

这是我的数据框

> 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

现在,我想将 df 第一列中的 x 轴标签替换为通用组标签。
此类问题已在这里得到解答:Multirow axis labels with nested grouping variables但我的问题不同,因为我使用的是堆积图。
请帮忙!

最佳答案

大量借鉴 @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

您需要确保您的级别按“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))

这需要更少的工作。这次标签不一定位于中间,它直接位于中间的条形下方(如果组中有偶数个条形,则位于其左侧)

关于r - 在堆叠的ggplot2条形图中打印组x轴标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24645961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com