【问题标题】:How to get axis ticks labels with different colors within a single axis for a ggplot graph?如何在ggplot图的单个轴内获取具有不同颜色的轴刻度标签?
【发布时间】:2014-06-06 06:18:55
【问题描述】:

考虑一个简单的 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))

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

结果会是这样的

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

【问题讨论】:

  • 我不同意你的最后一句话。如果要突出显示“异常值”,请为点着色。关于这个问题:是的,这是可能的。然而,这并不容易,因为 ggplot2 并不是为此而设计的。因此,您可能必须生成 grob 并破解它。
  • 其实这个功能是我们的平面设计师要求的。实际的图比这个简单的例子要密集得多,轴上的标签很长。我们使用颜色修改来稍微减轻非异常点的名称。离群值名称突然出现,这正是该图的目的。这对于沟通来说是相当有效的,真的;)
  • this question的可能重复

标签: r ggplot2


【解决方案1】:

一种更简单的方法 (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))

【讨论】:

  • 非常感谢!如果图表是用facet_grid(...,scales="free_y") 绘制的,那么这个方法似乎不再适用了,因为颜色向量是通过刻面回收的。这种情况的想法?
  • 我猜这可能是一个新问题
【解决方案2】:

我认为这不如为异常点本身着色,但您可以破解 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)

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

【讨论】:

  • 谢谢,这绝对是要走的路。我将努力弄清楚如何自动化 grob 的本地化。我对 gtable 结构还不是很熟悉。
  • 对于无条件情节你可以做ggplot(dat) + geom_point(data = dat, aes(x=value,y=name)) + theme(axis.text.y = element_text(colour=c("grey50", "red", "grey50")))
猜你喜欢
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多