R语言 为连续轴刻度创建条件标签

c2e8gylq  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(175)

我想有条件地改变一个连续刻度线标签的颜色/面/等使用逻辑而不是硬编码。例如:

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..来绘制密度图)。如果是这样的话,如果你能教我如何找到它/自己弄清楚它,那就加分了

wqsoz72f

wqsoz72f1#

感谢Djork教我一些QNA礼仪。
我能够通过在ggplot之外定义断点,然后在theme函数中使用ifelse逻辑来创建我想要的结果来解决这个问题。我的原始代码的更新(和工作)示例如下:

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')))

我还没有在更复杂的逻辑上尝试过这种方法,但我认为这种方法可以适用于所有逻辑格式。

相关问题