我想使用逻辑而不是硬编码来有条件地改变连续刻度标记的颜色/面/等。例如:
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..
作为密度图)。如果是这样的话,如果你可以教我如何找到它/想出我自己的奖励积分
非常感谢Djork教我一些QnA礼仪......
我能够通过在ggplot之外定义我的断点然后在ifelse
函数中使用theme
逻辑来创建我想要的结果来解决这个问题。我原始代码的更新(和工作)示例如下:
library(tidyverse)
library(viridis)
xx=rpois(1000,lambda = 40)
y=density(xx,n=3600,from=0)
med_x=median(xx)
breakers = c(seq(0,100,25),med_x)
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=breakers,limits=c(0,100))+
theme(axis.text.x = element_text(face=ifelse(breakers==med_x,'bold','plain'),
color=ifelse(breakers==med_x,'red','black')))
我还没有尝试过更复杂的逻辑,但我认为这种方法适用于所有逻辑格式。