通过geom_text()传递对象的embolden子串

时间:2018-06-08 19:17:45

标签: html r ggplot2 fonts

我正在尝试制作一个图表,我想加粗geom_text()字符串的一部分。这是一些示例数据和图表:

temp <- data.frame(num = c("big"),
                   text = c("small bullet point of text"),
                   col = c("red"))

ggplot(data = temp) +
  lims(x = c(0,100), y = c(0, 100)) + 
  geom_text(aes(x = 20, y = 50, label = num, color = col), size = 25) +
  geom_text(aes(x = 60, y = 50, label = text), size = 3)

enter image description here

理想情况下,我想做两件事。首先,最重要的是,我想鼓励“子弹”这个词,并且只鼓励那个词。其次,如果可能的话,我想将单词bullet的颜色改为“red”,以匹配“big”这个单词的颜色。

我已阅读here涉及bold()函数的解决方案,这些解决方案似乎来自grDevices包,但我无法解决这个问题。当我在该链接中尝试该示例时,它会出现以下错误:

> paste("No. of ", bold("bacteria X"), " isolates with corresponding types")
Error in bold("bacteria X") : could not find function "bold"

此外,我希望能够从环境中调用一个对象,以便我可以将其打包为一个函数。我已经阅读了关于使用bquote() here的内容,但显然我无法对其进行测试,因为我无法让bold()工作。

所以,1)为什么我不能让bold()工作? 2)bquote() bold()最好的方法是> sessionInfo() R version 3.4.1 (2017-06-30) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows Server 2008 R2 x64 (build 7601) Service Pack 1 Matrix products: default attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] tidyr_0.8.1 stringr_1.3.1 scales_0.5.0 readxl_1.1.0 ggplot2_2.2.1 dplyr_0.7.5 loaded via a namespace (and not attached): [1] Rcpp_0.12.17 knitr_1.17 bindr_0.1.1 magrittr_1.5 tidyselect_0.2.3 [6] munsell_0.4.3 colorspace_1.3-2 R6_2.2.2 rlang_0.2.1 plyr_1.8.4 [11] tools_3.4.1 grid_3.4.1 gtable_0.2.0 digest_0.6.12 lazyeval_0.2.0 [16] assertthat_0.2.0 tibble_1.4.2 bindrcpp_0.2.2 reshape2_1.4.2 purrr_0.2.4 [21] glue_1.2.0 labeling_0.3 stringi_1.1.7 compiler_3.4.1 pillar_1.1.0 [26] cellranger_1.1.0 pkgconfig_2.0.1 吗? 3)我认为html标签可能是一种简单的方法,有没有办法传递包含html标签的字符串,并正确地使用ggplot interpert? 4)我对色彩方面的期望不高,因为大胆的部分是我真正关心的,但如果你有任何建议,我会很乐意接受它们。谢谢!

{
     "Body": "{\n    \"field_1\": \"test\", \n    \"field_2\": \"10000\", \n    \"field_3\": \"2017-04-20T00:00:00.000Z\", \n    \"field_4\": \"10\"\n}",
     "BodyJson": {
          "field_1": "test",
          "field_2": 10000,
          "field_3": "2017-04-20T00:00:00.000Z",
          "field_4": 10
     }
}

2 个答案:

答案 0 :(得分:4)

ggplot2 中使用plotmath每次都会让我感到困惑,特别是在尝试传入变量时。

认为我按照你想要的方式工作,完成一个带有从变量传递的单独颜色的粗体字。它涉及deparse() bquote() bold()以及phantom()。呼。

phantom()代表您想要用特定颜色显示的单词的位置,因此需要两个annotate()图层才能使整个表达式使用不同的颜色。

a = "bullet"
ggplot(mtcars, aes(x = wt, y = mpg)) + 
    annotate("text", x = 4, y = 25, 
             label = deparse(bquote(phantom(small)~bold(.(a))~phantom(point~of~text))),
             colour = "red", parse = TRUE) +
    annotate("text", x = 4, y = 25, 
             label = deparse(bquote(small~phantom(bold(.(a)))~point~of~text)),
             colour = "black", parse = TRUE)

enter image description here

添加构面

我确信有一种更简单的方法可以解决方面,而“a”可以作为向量,但这是我在星期五下午提出来的。 :-D

我的方法是循环遍历(字符)向量并使用所有去除和bquoting等创建一个新变量。 faceting变量是文本数据集的一部分。

dat = data.frame(x = c(4, 4),
                 y = c(25, 25),
                 a = c("bullet", "shell"),
                 am = c(0, 1) )

dat$a1 = sapply(as.character(dat$a), 
                       function(x) deparse(bquote(phantom(small)~bold(.(x))~phantom(point~of~text))), 
                simplify = TRUE)
dat$a2 = sapply(as.character(dat$a), 
                       function(x) deparse(bquote(small~phantom(bold(.(x)))~point~of~text)), 
                simplify = TRUE)

ggplot(mtcars, aes(x = wt, y = mpg) ) +
    geom_text(data = dat, aes(x, y, label = a1), color = "red", parse = TRUE) +
    geom_text(data = dat, aes(x, y, label = a2), color = "black", parse = TRUE) +
    facet_wrap(~am)

enter image description here

使用多个变量

最后,如果您需要使用颜色和字体样式粘贴字符,并在向量中使用多个列,则可以这样做。我的方法涉及到遍历数据集中的每一行,使用包含标签信息的列。注意我正在处理字符(而不是因素)以避免出现问题。

我从包 purrr 中提取辅助函数pmap()以进行逐行工作。

如果每个构面中突出显示的单词的颜色需要不同,您可以在data.frame中定义颜色,并使用scale_color_identity来使用这些颜色。

dat = data.frame(x = c(4, 4),
                 y = c(25, 25),
                 a = c("bullet", "shells"),
                 b = c("point of text", "on the beach"),
                 am = c(0, 1),
                 color = c("red", "purple"),
                 stringsAsFactors = FALSE)

library(ggplot2)
library(purrr)

dat$a1 = pmap_chr(dat, function(a, b, ...) 
                deparse(bquote(phantom(small)~bold(.(a))~phantom(.(b))) ) )

dat$a2 = pmap_chr(dat, function(a, b, ...) 
     deparse(bquote(small~phantom(bold(.(a)))~.(b))))

ggplot(mtcars, aes(x = wt, y = mpg) ) +
     geom_text(data = dat, aes(x, y, label = a1, color = color), parse = TRUE) +
     geom_text(data = dat, aes(x, y, label = a2), color = "black", parse = TRUE) +
     facet_wrap(~am) +
     scale_color_identity()

enter image description here

答案 1 :(得分:0)

试试这个:

my_text <- expression(paste("small ", bold("bullet"), " point of text"))
ggplot() +
  lims(x = c(0,100), y = c(0, 100)) + 
  annotate('text', x=25, y=25, label=my_text)

enter image description here