【发布时间】:2018-08-11 02:34:49
【问题描述】:
我想使用逻辑而不是硬编码有条件地更改连续刻度标记标签的颜色/面部/等。例如:
library(tidyverse)
library(viridis)
xx=rpois(1000,lambda = 40)
y=density(xx,n=3600,from=0)
ggplot(data.frame(x = y$x, y = y$y), aes(x, y)) +
geom_line() +
geom_segment(aes(xend = x, yend = 0, colour = y)) +
scale_color_viridis() +
labs(y='Density',x='Count',colour='Density')+
geom_vline(xintercept=40,color='red') +
scale_x_continuous(breaks=c(0,40,seq(25,100,25)),limits=c(0,100))+
theme(axis.text.x = element_text(face=c('plain','bold',rep('plain',4)),
color=ifelse(y$x==60,'red','black')))
所以在我上面的例子中,硬编码出现在 face 函数中并且有效(我可以为 color 做同样的事情)。这没什么大不了的,因为我只有几个休息时间。不过,在未来的场景中,我的轴可能需要更多的休息时间或不太简单的配色方案。是否有更有效的解决方案来创建基于条件逻辑的标签?我的第一次尝试是在 color 函数中看到的,但这不起作用。问题在于识别要在逻辑语句中使用的对象。也许有一个幕后变量我可以要求休息(类似于使用..level.. 进行密度图)。如果是这样的话,如果你能教我如何找到它/我自己弄清楚的话,加分
【问题讨论】:
-
像
..level..这样的“幕后”变量通常只在aes()内部可用。 -
我认为您无法在
theme内以编程方式进行操作。但是,如果您已经指定了breaks向量,只需使用它预先创建人脸向量即可。另见:Change color of specific tick in ggplot2 -
谢谢!这些帮助很大。我听取了您的建议,并在情节之前定义了我的
breaks向量。然后我可以在主题中使用ifelse逻辑......即ifelse(breaks==40,'red','black')我不确定它是否比在情节之前定义颜色(或面部)矢量(如中断矢量)更好,但我认为这很有趣看看它的工作。 -
@godzilla 您应该将您的解决方案写为答案并接受它以标记此问题已回答。这是一个有趣的问题! :)
标签: r ggplot2 conditional axis-labels