带有自定义字体的 ggplot 在闪亮应用程序上无法正确显示

sym*_*ush 5 r ggplot2 shiny extrafont

我可以自定义字体ggplot

\n\n
library(extrafont)\n\nwindowsFonts()\nfont_import(pattern = "comic", prompt = FALSE)\nloadfonts(device = "win")\nwindowsFonts()\n\nggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) + \n  geom_line(position="jitter", color="red", size=2) + theme_bw() +\n  theme(text=element_text(size=16,  family="Comic Sans MS"))\n
Run Code Online (Sandbox Code Playgroud)\n\n

这呈现为:

\n\n

在此输入图像描述

\n\n

有关该主题的更多信息,例如此处此处

\n\n
\n\n

我还可以将该图和 extrafont 集成到一个闪亮的应用程序中,该应用程序在本地运行,如下所示:

\n\n
library(ggplot2)\nlibrary(extrafont)\nlibrary(shiny)\n\nfont_import(paths = "www", pattern = "comic", prompt = FALSE)\nloadfonts()\nprint(fonts())\n\nui <- fluidPage(plotOutput("plot"),textOutput("fonts"))\n\nserver <- function(input, output) {\n   output$plot <- renderPlot({\n     ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) + \n       geom_line(position="jitter", color="red", size=2) + theme_bw() +\n       theme(text=element_text(size=16,  family="Comic Sans MS"))\n   })\n   output$fonts <- renderText(print(fonts()))\n}\n\nshinyApp(ui = ui, server = server)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

但是,当我尝试将其部署到shinyapps.io 时,出现错误:

\n\n
\n

应用程序无法启动(以代码 1 退出)。

\n\n

使用 R 注册字体 扫描 www 中的 ttf 文件 ... 从 .ttf 文件中提取 .afm\n 文件...\n /srv/connect/apps/21-comic-font/www/comici.ttfWarnung in gzfile(dest, \n "w") 参见 komprimierte Datei\n \'/opt/R/3.4.3/lib/R/library/extrafontdb/metrics/comici.afm.gz\' nicht\n \xc3\xb6ffnen。格伦德事件。值 [3L] 中的“权限被拒绝” Fehler :\n kann Verbindung nicht \xc3\xb6ffnen Ruft auf: local ... tryCatch ->\n tryCatchList -> tryCatchOne -> Ausf\xc3\xbchrung angehalten

\n
\n\n
\n\n

我试图通过合并这里的答案来解决这个问题。我将.ttf文件添加到该www目录,并将extrafontdb包源添加到该r-lib目录。(当然,我部署了两者......)。

\n\n

完整的app.R文件现在如下所示:

\n\n
.libPaths(c(\'r-lib\', .libPaths()))\ninstall.packages(\'r-lib/extrafontdb_1.0.tar.gz\',type = \'source\',repos = NULL)\n\nlibrary(ggplot2)\nlibrary(extrafontdb)\nlibrary(extrafont)\nlibrary(shiny)\n\nfont_import(paths = "www", pattern = "comic", prompt = FALSE)\nloadfonts()\nprint(fonts())\n\nui <- fluidPage(plotOutput("plot"),textOutput("fonts"))\n\nserver <- function(input, output) {\n  output$plot <- renderPlot({\n    ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) +\n      geom_line(position="jitter", color="red", size=2) + theme_bw() +\n      theme(text=element_text(size=16,  family="Comic Sans MS"))\n  })\n  output$fonts <- renderText(print(fonts()))\n}\n\nshinyApp(ui = ui, server = server)\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我部署它时,我得到一个正在运行的应用程序和以下输出:

\n\n

在此输入图像描述

\n\n

现在奇怪的是,renderText(print(fonts()))打印出Comic Sans MS。所以它看起来的字体已经加载了。但该图没有显示正确的字体。

\n\n

这是为什么?我该如何解决它?

\n

sym*_*ush 6

我找到了一个似乎可以工作的解决方案shinyapps.io (但不能在本地工作,因为它是一个仅限 Linux 的解决方案。不知何故,它不适用于我原来的“ComicSans MS”字体,但该字体无论如何都不漂亮..;-))

开始了:

  1. 将自定义字体放入www目录中:例如IndieFlower.ttf这里
  2. 请按照此处的步骤操作

这将导致以下app.R文件:

ibrary(ggplot2)
library(shiny)

dir.create('~/.fonts')
file.copy("www/IndieFlower.ttf", "~/.fonts")
system('fc-cache -f ~/.fonts')

ui <- fluidPage(plotOutput("plot"))

server <- function(input, output) {
  output$plot <- renderPlot({
    ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) +
      geom_line(position="jitter", color="red", size=2) + theme_bw() +
      theme(text=element_text(size = 16, family = "IndieFlower"))
  })
}

shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

情节如下:

在此输入图像描述