将ggplot对象转换为使用Open Sans Semibold字体的svg

我想创建一个使用Open Sans Semibold字体的ggplot图,然后我想将此图转换为svg.最后在rmarkdown doc中包含这个.最大的问题是在浏览器上转换的ggplot对象上使用Open Sans Semibold.

>我使用svglite将ggplot转换为svg,效果很好.
>我在轴的标题中包含了Open Sans Semibold字体(我在本地存储了所有Open Sans系列).
>我创建了rmarkdown doc.

---
title: ""
output: html_document
---

```{r setup, include = FALSE}
library(svglite)
knitr::opts_chunk$set(
  dev = "svglite",
  fig.ext = ".svg"
)
```

```{r, warning = F, message = F, echo = F}
library(ggplot2)

data(cars)

ggplot(mtcars, aes(mpg, qsec, color = factor(cyl))) +
   geom_point() +
   theme(text = element_text(family = 'Open Sans'),
        axis.title = element_text(family = 'Open Sans Semibold'))

```

当我在Chrome / Opera / Mozilla浏览器中打开此文档时,Open Sans Semibold不会显示.相反,Arial取而代之.然而在Safari中它完美无缺.
事实证明(更多信息here)在使用Open Sans Semibold和Light的浏览器上存在典型问题.为了解决它而不是使用semibold版本,我使用css font-weight和基本的’Open Sans’,sans-serif.当我创建一个< p>时它完美地工作.

---
title: ""
output: html_document
---

<style> 
      @import url(https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700);

      .text_basic {
            font-family: 'Open Sans', sans-serif;
      }

      .text_semibold {
            font-family: 'Open Sans', sans-serif;
            font-weight: 700;
      }
</style>

<p class = 'text_basic'> 
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellat, nisi quasi cupiditate, ratione, consequuntur adipisci reiciendis impedit, laborum tenetur qui neque nobis enim. Sunt 
</p>

<p class = 'text_semibold'>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellat, nisi quasi cupiditate, ratione, consequuntur adipisci reiciendis impedit, laborum tenetur qui neque nobis enim. Sunt 
</p>

```{r setup, include = FALSE}
library(svglite)
knitr::opts_chunk$set(
      dev = "svglite",
      fig.ext = ".svg"
)
```

```{r, warning = F, message = F, echo = F}
library(ggplot2)

data(cars)

ggplot(mtcars, aes(mpg, qsec, color = factor(cyl))) +
      geom_point() +
      theme(text = element_text(family = 'Open Sans'),
            axis.title = element_text(family = 'Open Sans Semibold'))

```

但是这个解决方案对ggplot对象不起作用,因为它仍然使用Open Sans Semibold字体.在ggplot中,不可能使用font-weight,因为没有这样的东西.相反,您只能使用face参数,但该选项不接受数值.

我最初认为可行的一种解决方法是将ggplot对象转换为html代码,然后使用css来操作轴上的字体.

---
title: ""
output: html_document
---

```{r setup, include = FALSE}
library(svglite)
knitr::opts_chunk$set(
      dev = "svglite",
      fig.ext = ".svg"
)
```

```{r, warning = F, message = F, echo = F}
library(ggplot2)

data(cars)

s <- svgstring()

ggplot(mtcars, aes(mpg, qsec, color = factor(cyl))) +
      geom_point() +
      theme(text = element_text(family = 'Open Sans'),
            axis.title = element_text(family = 'Open Sans Semibold'))

htmltools::HTML(s())
invisible(
      dev.off()
)

```

在这种情况下,可以检测文本标签并按照我的意愿操纵它们,但生成的代码是平的,即不容易区分与标签和标题相关的文本标签.

那么,有谁有想法解决这个问题?

谢谢任何读过最后一句的人.我试图尽可能简短地总结我的问题.

最佳答案 您的解决方法的想法似乎都是直接的方法,并且为了使它们适用于绘图,您可以使用gsub直接修改HTML并设置文本的style属性的font-weight:

s <- svgstring()

ggplot(mtcars, aes(mpg, qsec, color = factor(cyl))) +
      geom_point() +
      theme(text = element_text(family = 'Open Sans'),
            axis.title = element_text(family = 'Open Sans Semibold'))

gsub("font-family: Open Sans Semibold;", 
     "font-family: Open Sans;font-weight: 700;", 
     htmltools::HTML(s()))
点赞