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

Nic*_*abo 5 svg r ggplot2 r-markdown

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

  1. 我曾经svglite转换ggplotsvg它,并且效果很好。
  2. 我在轴标题中包含了Open Sans Semibold字体(我将所有Open Sans系列存储在本地)。
  3. 我创建了rmarkdown文档。

    ---
    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'))
    
    ```
    
    Run Code Online (Sandbox Code Playgroud)

当我在Chrome / Opera / Mozilla浏览器中打开此文档时,Open Sans Semibold不显示。相反,Arial替换了它。但是,在Safari中它可以完美运行。事实证明(在这里有更多信息),那些使用Open Sans Semibold和Light的浏览器存在一个典型的问题。为了解决它而不是使用半粗体版本,我将CSS font-weight与basic一起使用'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'))

```
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案不适用于ggplot对象,因为它仍使用Open Sans Semibold字体。在ggplot这是不可能使用font-weight,因为没有这样的事情。相反,您只能使用face参数,但该选项不接受numeric值。

我最初认为可以解决的一种变通方法是将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()
)

```
Run Code Online (Sandbox Code Playgroud)

在那种情况下,可以text按照我的意愿检测和操作标签,但是生成的代码是扁平的,即,区分text与标签和标题相关的标签并不容易。

那么,有人有解决这个问题的想法吗?

感谢阅读这最后一句话的任何人。我试图总结我的问题越短越好。

Hub*_*rtL 2

您的解决方法的想法似乎都是直接的方法,为了使它们与绘图一起工作,您可以使用gsub直接修改 HTML 并设置font-weight文本的 style 属性:

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()))
Run Code Online (Sandbox Code Playgroud)