具有自定义字体的ggplot无法在Shinyapps.io上正确显示

时间:2019-03-11 10:45:54

标签: r ggplot2 shiny extrafont

我可以使用以下方法自定义ggplot中的字体:

library(extrafont)

windowsFonts()
font_import(pattern = "comic", prompt = FALSE)
loadfonts(device = "win")
windowsFonts()

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="Comic Sans MS"))

这呈现为:

enter image description here

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


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

library(ggplot2)
library(extrafont)
library(shiny)

font_import(paths = "www", pattern = "comic", prompt = FALSE)
loadfonts()
print(fonts())

ui <- fluidPage(plotOutput("plot"),textOutput("fonts"))

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="Comic Sans MS"))
   })
   output$fonts <- renderText(print(fonts()))
}

shinyApp(ui = ui, server = server)

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

  

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

     

用R注册字体,在www中扫描ttf文件...提取.afm   .ttf文件中的文件...   /srv/connect/apps/21-comic-font/www/comici.ttfgzfile中的警告(目标,   “ w”)kann komprimierte Datei   '/opt/R/3.4.3/lib/R/library/extrafontdb/metrics/comici.afm.gz'nicht   öffnen。 Grundevtl。 “权限被拒绝” Fehler的值[3L]:   kann Verbindung nichtöffnenRuft auf:本地... tryCatch->   tryCatchList-> tryCatchOne->Ausführungangehalten


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

完整的app.R文件现在看起来像:

.libPaths(c('r-lib', .libPaths()))
install.packages('r-lib/extrafontdb_1.0.tar.gz',type = 'source',repos = NULL)

library(ggplot2)
library(extrafontdb)
library(extrafont)
library(shiny)

font_import(paths = "www", pattern = "comic", prompt = FALSE)
loadfonts()
print(fonts())

ui <- fluidPage(plotOutput("plot"),textOutput("fonts"))

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="Comic Sans MS"))
  })
  output$fonts <- renderText(print(fonts()))
}

shinyApp(ui = ui, server = server)

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

enter image description here

现在很奇怪的是,renderText(print(fonts()))打印的是 Comic Sans MS 。因此似乎我的字体已加载。但是该图未显示正确的字体。

那是为什么?我该如何解决呢?

1 个答案:

答案 0 :(得分:0)

我找到了一个似乎可以在shinyapps.io 上使用的解决方案(但不能在本地使用,因为这是仅Linux的解决方案。而且某种程度上,它不能与我的原始“ ComicSans MS”字体一起使用,但是字体仍然不漂亮。.;-))

我们在这里:

  1. 将自定义字体放在www目录中,例如hereIndieFlower.ttf
  2. 按照here的步骤操作

这将导致以下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)

情节如下:

enter image description here