Shiny ggplot中Unicode形状本地正常,Docker与shinyapps.io显示异常
解决Shiny应用部署后Unicode Emoji无法显示的问题
核心原因
- geom_point的shape参数不支持复杂Emoji:ggplot2的
shape仅支持有限的单字节/双字节符号(对应pch编号),多字节Emoji必须用geom_text的label参数实现。 - 部署环境缺少Emoji支持字体:shinyapps.io和rocker镜像默认未安装支持彩色Emoji的字体。
方案1:Docker容器环境配置
修改Dockerfile安装Emoji字体
在系统依赖安装步骤中添加支持Emoji的字体包:
FROM rocker/shiny-verse:4.1.2 RUN apt-get update && apt-get install -y \ libcurl4-gnutls-dev \ libssl-dev \ fonts-noto-color-emoji # 新增安装Noto彩色Emoji字体 RUN apt-get install -y locales locales-all ENV LC_ALL en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US.UTF-8 RUN R -e 'install.packages(c(\ "https://cran.r-project.org/src/contrib/Archive/ggplot2/ggplot2_3.3.5.tar.gz",\ "https://cran.r-project.org/src/contrib/tidyr_1.2.1.tar.gz",\ "https://cran.r-project.org/src/contrib/Archive/shiny/shiny_1.7.3.tar.gz"),\ repos=NULL,type="source")' COPY . /app CMD ["R", "-e", "shiny::runApp('/app', host = '0.0.0.0', port = 4849)"]
修改app.R中的绘图代码
替换geom_point为geom_text并指定安装的字体:
output$plot<-renderPlot({ df%>% ggplot()+ geom_text(aes(x=x,y=y), label="\U0001F37C", size=20, family = "Noto Color Emoji") })
方案2:shinyapps.io环境配置
使用showtext包加载支持Emoji的字体,无需依赖系统字体:
修改app.R代码
library(shiny) library(tidyr) library(ggplot2) library(showtext) # 自动启用showtext渲染 showtext_auto() # 从Google Fonts加载Noto Emoji字体 font_add_google("Noto Color Emoji", "noto_emoji") ui<-fluidPage(plotOutput("plot"), plotOutput("plot2")) server <- function(input, output, session) { df<-data.frame(x=0:10, y=0:10) output$plot<-renderPlot({ df%>% ggplot()+ geom_text(aes(x=x,y=y), label="\U0001F37C", size=20, family = "noto_emoji") }) output$plot2<-renderPlot({ df%>% ggplot()+ geom_point(aes(x=x,y=y),shape=18,size=20) }) } shinyApp(ui, server)
验证字体是否可用
可以在R中运行以下代码查看系统已安装字体,确保指定的字体名称正确:
systemfonts::system_fonts()
内容的提问来源于stack exchange,提问作者Devraj
相关产品推荐
相关产品推荐

