【问题标题】:Mulitple color in geom_text ggplot2 figuregeom_text ggplot2图中的多种颜色
【发布时间】:2021-11-16 10:38:29
【问题描述】:

我需要帮助才能在 ggplot2 图中为 geom_text 标签的特定部分着色。

这是我用来生成示例的代码:

library(ggrepel)
set.seed(42)

dat <- subset(mtcars, wt > 2.75 & wt < 3.45)
dat$car <- rownames(dat)

dat$colored_text <- "/A"
dat$car2 <- paste0(dat$colored_text,'-',dat$car)


p <- ggplot(dat, aes(wt, mpg, label = car2)) +
  geom_point(color = "red")

p1 <- p + geom_text() + labs(title = "geom_text()")

这是 p1 的结果:

我想将每个 / 涂成绿色,将每个字母 A 涂成蓝色,然后得到类似:

请问有人有这个想法吗?

【问题讨论】:

    标签: r ggplot2 ggrepel


    【解决方案1】:

    实现您想要的结果的一个选项是ggtext 包,与geom_text 相比,它提供了更多的文本呈现可能性,并且允许通过markdown 和/或HTML/CSS 设置文本样式,如下所示:

    library(ggplot2)
    library(ggtext)
    
    set.seed(42)
    
    dat <- subset(mtcars, wt > 2.75 & wt < 3.45)
    dat$car <- rownames(dat)
    
    dat$colored_text <- "<span style='color: green'>/</span><span style='color: blue'>A</span>"
    dat$car2 <- paste0(dat$colored_text,'-',dat$car)
    
    ggplot(dat, aes(wt, mpg, label = car2)) +
      geom_point(color = "red") + 
      geom_richtext(fill = NA, label.colour = NA) + 
      labs(title = "geom_richtext()")
    

    编辑使the approach suggested by the author of ggrepel适应您的情况,您可以使用ggrepel获得您想要的结果,如下所示:

    library(ggplot2)
    library(ggrepel)
    
    dat <- subset(mtcars, wt > 2.75 & wt < 3.45)
    dat$car <- rownames(dat)
    
    phantom <- function(x) {
      paste0('phantom("', x, '")')
    }
    
    quotes <- function(x) {
      paste0('"', x, '"')
    }
    dat$label_green <- paste(quotes("/"), phantom('A'), quotes("-"), phantom(dat$car), sep = " * ")
    dat$label_blue <- paste(phantom('/'), quotes("A"), quotes("-"), phantom(dat$car), sep = " * ")
    dat$label_black <- paste(phantom('/'), phantom('A'), quotes("-"), quotes(dat$car), sep = " * ")
    
    ggplot(dat, aes(wt, mpg)) +
      geom_point(color = "red") + 
      geom_text_repel(aes(label = label_green), color = "green", parse = TRUE, seed = 1) +
      geom_text_repel(aes(label = label_blue), color = "blue", parse = TRUE, seed = 1) +
      geom_text_repel(aes(label = label_black), color = "black", parse = TRUE, seed = 1) +
      labs(title = "Multi-color geom_repel_text()")
    

    【讨论】:

    • 非常感谢您!我还有一个问题:我们是否也可以通过在标签文本中添加\n 来添加linebreak?例如,如果我想在 /A 之后添加 /n
    • 当然。但是你必须使用html标签&lt;br&gt;而不是\n
    • 并且没有办法使用 geom_text_repel 函数来避免重叠的文本元素?
    • 不幸的是,目前还没有。也许在下一个版本中。但是,请参阅 github.com/slowkow/ggrepel/issues/145#issuecomment-557224975 了解使用 ggrepel 获取多色文本的方法。
    • 是的,我看到了那个,但我无法用他的代码重现我的示例
    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 2020-09-13
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多