对于ggplot图,如何在单个轴内获得具有不同颜色的轴刻度标签?

时间:2014-06-06 06:18:56

标签: r ggplot2

考虑一个简单的ggplot2图

library(ggplot2) 
dat <- data.frame(name=c("apple", "orange", "plum"),value=c(3,8,2),outlier=c(FALSE,TRUE,FALSE))
ggplot(dat)+geom_point(aes(x=value,y=name))

enter image description here

有没有办法有条件地修改轴y标签(比如颜色)的样式属性,例如取决于outlier中的dat列?

结果将类似于

enter image description here

在具有大量项目的图表上,此功能将大大提高图表的可读性和影响力。

2 个答案:

答案 0 :(得分:21)

更简单的方法(IMO)就是创建条件颜色向量并将其解析为axis.text.y

dat <- data.frame(name=c("apple", "orange", "plum"),value=c(3,8,2),outlier=c(FALSE,TRUE,FALSE))
colvec <- character(dim(dat)[1])
colvec <- ifelse(dat$outlier, "red", "black")

library(ggplot2) 
ggplot(dat) +
geom_point(data = dat, aes(x=value,y=name)) +
theme(axis.text.y = element_text(colour=colvec))

enter image description here

答案 1 :(得分:4)

我认为这不如着色异常点本身那么好,但你可以在grob上劈开:

p <- ggplot(dat)+geom_point(aes(x=value,y=name))
g <- ggplotGrob(p)

#I found this by using str(g) and looking for "axis.text.y.text"
#there is probably a clever way of automating this
g[[1]][[2]]$children$axis$grobs[[1]]$gp$col <- c("grey50", "red", "grey50")

plot(g)

enter image description here

有条件地执行此操作可以使用类似c("grey50", "red")[dat$outlier]的内容,假设行顺序是必需的。但是,我只能重申,如果你认为你需要这样的东西,你可能应该创建一个不同的图形。