如何在R语言中结合geom_image使用SVG格式图片?
在ggplot中用ggimage加载SVG图片的解决方法
我想用ggimage包在ggplot图表里加图标和图片,现在能正常加载本地或在线的PNG图,但SVG格式的(比如指定的沙漏SVG)死活加载不出来,一开始试了geom_icon图层也不行。下面是我能跑通的PNG示例代码:
library("ggplot2") library("ggimage") mtcars %>% mutate(am = factor(am)) %>% group_by(am) %>% summarise(avg_mpg = mean(mpg)) %>% mutate(image = c("https://www.r-project.org/logo/Rlogo.png", "https://jeroenooms.github.io/images/frink.png")) %>% ggplot(aes(x=factor(am), y=avg_mpg)) + geom_col(width = 0.5) + geom_image(aes(image=image), size=.2) + theme_minimal()
效果图:
解决方法
方法1:用svgparser转SVG为栅格对象
ggimage的geom_image不直接支持SVG,我们可以先拿svgparser把SVG解析成栅格对象,再传给geom_image:
library("ggplot2") library("ggimage") library("svgparser") library("dplyr") # 解析目标SVG为栅格对象 hourglass_svg <- svgparser::read_svg("https://raw.githubusercontent.com/ionic-team/ionicons/main/src/svg/hourglass.svg") mtcars %>% mutate(am = factor(am)) %>% group_by(am) %>% summarise(avg_mpg = mean(mpg)) %>% mutate(image = list(hourglass_svg, hourglass_svg)) %>% # 用解析后的SVG对象替换图片链接 ggplot(aes(x=factor(am), y=avg_mpg)) + geom_col(width = 0.5) + geom_image(aes(image=image), size=.2) + theme_minimal()
方法2:用magick处理SVG转成可识别格式
用magick包读取SVG并转换成内存中的PNG格式,再给ggimage用:
library("ggplot2") library("ggimage") library("magick") library("dplyr") # 读取SVG并转为magick对象 hourglass_magick <- image_read_svg("https://raw.githubusercontent.com/ionic-team/ionicons/main/src/svg/hourglass.svg") mtcars %>% mutate(am = factor(am)) %>% group_by(am) %>% summarise(avg_mpg = mean(mpg)) %>% mutate(image = list(hourglass_magick, hourglass_magick)) %>% ggplot(aes(x=factor(am), y=avg_mpg)) + geom_col(width = 0.5) + geom_image(aes(image=image), size=.2) + theme_minimal()
关于geom_icon的说明
geom_icon主要是用来加载Font Awesome这类图标字体里的图标,不是直接读取本地或在线的SVG文件。如果想用内置图标,去看ggimage的文档找对应的图标名称和字体库配置就行。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

