【问题标题】:R ggplot: How can I create conditional labeling for a continuous axis ticksR ggplot:如何为连续轴刻度创建条件标签
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多