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

如何导出高分辨率桑基图(高DPI/TIFF)用于学术海报?

如何导出高质量桑基图用于学术海报

问题描述

我使用以下R代码生成桑基图:

# Libraries
library(tidyverse)
library(viridis)
library(patchwork)
library(hrbrthemes)
library(circlize)
library(webshot)

# Load dataset from github
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/13_AdjacencyDirectedWeighted.csv", header=TRUE)
# Package
library(networkD3)

# 转换为长格式
data_long <- data %>%
  rownames_to_column %>%
  gather(key = 'key', value = 'value', -rowname) %>%
  filter(value > 0)
colnames(data_long) <- c("source", "target", "value")
data_long$target <- paste(data_long$target, " ", sep="")

# 创建节点数据框
nodes <- data.frame(name=c(as.character(data_long$source), as.character(data_long$target)) %>% unique())

# 转换为networkD3需要的ID格式
data_long$IDsource=match(data_long$source, nodes$name)-1 
data_long$IDtarget=match(data_long$target, nodes$name)-1

# 生成桑基图
sankey <- sankeyNetwork(Links = data_long, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name", 
              sinksRight=FALSE, nodeWidth=40, fontSize=13, nodePadding=20)

# 保存为HTML
saveNetwork(sankey, "C:\\Users\\brett\\OneDrive\\Desktop\\sankey_diagram.html")

# 转换为PNG
webshot("C:\\Users\\brett\\OneDrive\\Desktop\\sankey_diagram.html","C:\\Users\\brett\\OneDrive\\Desktop\\sankey_diagram.png", vwidth = 1000, vheight = 900)

生成的图像分辨率偏低,无法满足学术海报的高质量需求,请问如何导出更高分辨率(如高DPI)或TIFF格式的桑基图?


解决方案

方法1:优化webshot参数提升分辨率

webshot支持通过scale参数放大画布,生成高分辨率图片,同时支持直接导出TIFF格式:

# 导出3倍分辨率的PNG(等效300DPI+)
webshot("C:\\Users\\brett\\OneDrive\\Desktop\\sankey_diagram.html",
        "C:\\Users\\brett\\OneDrive\\Desktop\\sankey_highres.png",
        vwidth = 1000, vheight = 900, scale = 3)

# 直接导出高分辨率TIFF
webshot("C:\\Users\\brett\\OneDrive\\Desktop\\sankey_diagram.html",
        "C:\\Users\\brett\\OneDrive\\Desktop\\sankey_highres.tiff",
        vwidth = 1000, vheight = 900, scale = 3)

说明:scale=3会将图片像素放大3倍,生成3000×2700的图像,完全满足学术海报的高DPI要求。

方法2:使用webshot2包精准控制DPI

webshot2是webshot的升级版,基于Chrome内核,支持直接设置DPI参数:

# 安装并加载webshot2
install.packages("webshot2")
library(webshot2)

# 导出300DPI的TIFF
webshot("C:\\Users\\brett\\OneDrive\\Desktop\\sankey_diagram.html",
        "C:\\Users\\brett\\OneDrive\\Desktop\\sankey_300dpi.tiff",
        vwidth = 1000, vheight = 900, dpi = 300)

方法3:导出SVG矢量图(无损缩放)

networkD3生成的桑基图是SVG矢量格式,可直接从浏览器导出后转成高质量位图:

  1. 打开保存的sankey_diagram.html文件;
  2. 右键点击桑基图,选择「另存为SVG」;
  3. 使用矢量工具(如Inkscape、Adobe Illustrator)将SVG转为300DPI以上的TIFF或PDF,实现无损缩放。

方法4:改用ggalluvial包直接生成高质量图

如果不想依赖网页导出,可使用ggplot2生态的ggalluvial包,直接导出矢量或高分辨率位图:

# 安装并加载包
install.packages("ggalluvial")
library(ggalluvial)

# 整理适配ggalluvial的数据格式
data_alluvial <- data_long %>%
  mutate(source = factor(source), target = factor(str_trim(target)))

# 绘制桑基图
p <- ggplot(data_alluvial,
       aes(y = value, axis1 = source, axis2 = target)) +
  geom_alluvium(aes(fill = source), width = 1/12) +
  geom_stratum(width = 1/12, fill = "white", color = "black") +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("Source", "Target"), expand = c(0.05, 0.05)) +
  theme_minimal() +
  theme(legend.position = "none")

# 导出300DPI的TIFF
ggsave("C:\\Users\\brett\\OneDrive\\Desktop\\sankey_ggalluvial.tiff",
       plot = p, dpi = 300, width = 12, height = 10)

# 导出矢量PDF(适合印刷)
ggsave("C:\\Users\\brett\\OneDrive\\Desktop\\sankey_ggalluvial.pdf",
       plot = p, width = 12, height = 10)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:57:11