You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2中Devanagari字体渲染异常问题及可复现代码

解决ggplot2中Devanagari字体渲染异常的问题

我来帮你搞定这个印地语字符“मित्र”在ggplot2里渲染出错的问题~ 这类复杂书写系统(比如Devanagari)的字体渲染容易踩坑,下面给你两种可靠的解决方法:

方法一:优化showtext的使用设置

showtext本身支持复杂字体,但需要确保加载和渲染的配置正确。修正后的代码如下:

library(ggplot2)
library(showtext)

# 明确加载Sahitya字体,指定family名称
font_add_google("Sahitya", family = "Sahitya")
# 启用showtext自动渲染
showtext_auto()
# 设置匹配屏幕的DPI,避免渲染错位或模糊
showtext_opts(dpi = 96)

p <- ggplot(NULL, aes(x = 1, y = 1)) +
  ylim(0.8, 1.2) +
  theme(
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    axis.text = element_blank()
  ) +
  annotate(
    "text", 
    x = 1, y = 0.9, 
    family = "Sahitya", 
    size = 15, 
    label = "मित्र" # 去掉原代码末尾的多余空格,避免干扰渲染
  )

print(p)

关键调整点:

  • 给font_add_google明确指定family参数,确保ggplot能精准调用字体
  • 添加showtext_opts(dpi = 96)匹配常规屏幕DPI,解决复杂字形的错位问题
  • 移除label末尾的多余空格,避免不必要的渲染干扰

方法二:改用ragg图形设备(更推荐复杂脚本场景)

如果showtext还是有问题,试试ragg——它基于HarfBuzz引擎,对Devanagari这类需要连合渲染的复杂字体支持更完善:

library(ggplot2)
library(ragg)

# 用ragg创建PNG设备,直接输出正确渲染的图形
agg_png("devanagari_friend_plot.png", width = 800, height = 600, res = 96)

ggplot(NULL, aes(x = 1, y = 1)) +
  ylim(0.8, 1.2) +
  theme(
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    axis.text = element_blank()
  ) +
  annotate(
    "text", 
    x = 1, y = 0.9, 
    family = "Sahitya", 
    size = 15, 
    label = "मित्र"
  )

# 关闭设备
dev.off()

运行后打开生成的PNG文件,就能看到正确渲染的“मित्र”(朋友)啦~

内容的提问来源于stack exchange,提问作者kel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:15:34