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

时间:2016-09-29 18:31:19

标签: r svg ggplot2 r-markdown

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

  1. 我使用svgliteggplot转换为svg,效果很好。
  2. 我在轴标题中包含了Open Sans Semibold字体(我在本地存储了所有Open Sans系列)。
  3. 我创建了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'))
    
    ```
    
  4. 当我在Chrome / Opera / Mozilla浏览器中打开此文档时,Open Sans Semibold不会显示。相反,Arial取而代之。然而在Safari中它完美无缺。 事实证明(更多信息here)在使用Open Sans Semibold和Light的浏览器上存在典型问题。为了解决它而不是使用semibold版本,我使用基本font-weight的css '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参数,但该选项不接受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()
    )
    
    ```
    

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

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

    感谢所有阅读最后一句话的人。我试图尽可能简短地总结我的问题。

1 个答案:

答案 0 :(得分:1)

您对解决方法的想法似乎都是直接的方法,并且为了使它们适用于绘图,您可以使用gsub直接修改HTML并设置样式属性的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()))