df <- data.frame(a=c(1,2,3,4,5,6),
b=c("x1","x2","y1","y2","w1","w2"),
c=runif(6),
d=c(1,1,2,2,3,3))
p <- ggplot(aes(x=b, y=c), data=df) +
geom_bar(stat="identity") +
facet_grid(~d, scales="free_x") 我想使用expression (或任何其他函数)来为每个标签创建下标。我试过这个:
new_labels <- c(expression("x[1]"),expression("x[2]"),expression("y[1]"),expression("y[2]"),expression("w[1]"),expression("w[2]"))
p + scale_x_discrete(labels=new_labels) 还有这个
new_labels2 <- c("x[1]","x[2]","y[1]","y[2]","w[1]","w[2]")
p + scale_x_discrete(labels=function(new_labels2) expression(new_labels2))但这些解决方案都没有给我带来预期的结果。
另外,如何才能将条颜色更改为在所有方面都相同?
我以为p + scale_fill_manual(values=c("green","red"))会起作用,但它没有效果。
发布于 2019-09-09 08:39:27
您可以为scale_x_discrete的labels参数提供一个函数,以将表达式生成为字符串,然后解析字符串以将其解释为表达式。在下面的示例中,我还添加了fill=grepl("1", b),它会根据b的值中是否有1将列b映射到fill美学。此映射是生成填充颜色所必需的,然后可以使用scale_fill_manual设置填充颜色。
p = ggplot(aes(x=b, y=c, fill=grepl("1", b)), data=df) +
geom_bar(stat="identity") +
facet_grid(~d, scales="free_x") +
guides(fill=FALSE) +
scale_x_discrete(labels=function(l) parse(text=gsub("(.)([0-9])", "\\1[\\2]", l)))
p

为了说明起见,下面是gsub函数在将字符串解析为表达式之前生成字符串所做的工作(基本上只是以编程方式执行您在问题中硬编码的操作):
p <- ggplot(aes(x=b, y=c, fill=grepl("1", b)), data=df) +
geom_bar(stat="identity") +
facet_grid(~d, scales="free_x") +
guides(fill=FALSE) +
scale_x_discrete(labels=function(l) gsub("(.)([0-9])", "\\1[\\2]", l))
p

gsub函数使用正则表达式进行替换。如果您不熟悉正则表达式,另一种可能不太透明的编码方法是:
function(l) paste0(substr(l,1,1), "[", substr(l,2,2), "]")如果你想设置自己的填充颜色,你可以这样做:
p + scale_fill_manual(values=c("green","red")) 关于您的评论中的问题:您可以创建一个虚拟分组变量,如下所示:
library(tidyverse)
p <- df %>%
group_by(b.grp = substr(b, 1, 1)) %>%
mutate(grp.val = 1:n()) %>%
ggplot(aes(x=b, y=c, fill=factor(grp.val))) +
geom_bar(stat="identity") +
facet_grid(~d, scales="free_x") +
guides(fill=FALSE) +
scale_x_discrete(labels=function(l) parse(text=gsub("(.)(.)", "\\1[\\2]", l)))https://stackoverflow.com/questions/57846598
复制相似问题