审稿人:为什么行业大牛的论文总喜欢用这个图?3个R包就能做!

文摘   2025-01-04 09:01   荷兰  

很多导师写论文不管是综述还是研究性论文都喜欢展示“流程图”,基本的流程图展示的是思路的变化,但是如果要展示“数据的流动”,就该用到桑基图了。

桑基图常常用于展示数据的流向和分布情况,广泛应用于能源流动、资金流向和供应链分析等领域。往往可以给人一种“高屋建瓴”之感。因此,桑基图本身是一个很简单的图表,却往往出现在很多权威杂志之上。我相信也有很多同学跟我一样对桑基图很感兴趣,今天我们的更新将从基础入门版,然后提供完整的R代码来创建高度美学优化的桑基图。


1. 桑基图简介

桑基图通过节点(nodes)和流(links)构成:

  • 节点(nodes): 代表数据中的主要类别或变量。

  • 流(links): 连接不同节点的线条,表示数据流动的方向与强度。

我们将使用以下 R 包来实现和优化桑基图:

networkD3:简单易用,支持交互式桑基图。
ggalluvial:高度自定义和美学优化,适合静态桑基图。


2. 基础版

# 加载必要的包
library(ggplot2)
library(ggalluvial)

# 数据准备
data <- data.frame(
source = c("A", "A", "B", "B", "C"),
target = c("X", "Y", "X", "Z", "Z"),
value = c(10, 20, 30, 40, 50)
)

# 简单的桑基图
ggplot(data, aes(y = value, axis1 = source, axis2 = target)) +
geom_alluvium(aes(fill = source), width = 1/12) +
geom_stratum(width = 1/8, fill = "grey") +
geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
theme_minimal()

3. 审美提升版

# 加载必要包
library(ggplot2)
library(ggalluvial)
library(viridis)

# 数据准备
data <- data.frame(
source = c("Energy Source", "Energy Source", "Energy Source",
"Coal", "Solar", "Natural Gas"),
target = c("Coal", "Solar", "Natural Gas",
"Electricity", "Electricity", "Electricity"),
value = c(100, 50, 70, 60, 30, 20)
)

# 优化后的桑基图
ggplot(data, aes(y = value, axis1 = source, axis2 = target)) +
# 流的绘制,透明度和曲线优化
geom_alluvium(aes(fill = source), curve_type = "sigmoid", width = 1/15, alpha = 0.85) +
# 节点设计,调整颜色、边框和宽度
geom_stratum(width = 1/10, fill = "grey30", color = "white") +
# 标签设计,位置和字体大小优化
geom_text(stat = "stratum", aes(label = after_stat(stratum)),
color = "white", size = 3, family = "Arial") +
# 调色板优化
scale_fill_viridis_d(option = "C", direction = -1) +
# 标题与图例调整
labs(title = "Energy Flow Analysis",
subtitle = "A High-Quality Sankey Diagram",
caption = "Data Source: Example Dataset") +
theme_minimal() +
theme(
# 标题和副标题居中对齐
plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 14, hjust = 0.5),
# 图例优化
legend.position = "bottom",
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.key.size = unit(0.4, "cm"),
# 坐标轴去除
axis.text = element_blank(),
axis.title = element_blank(),
# 网格线隐藏
panel.grid = element_blank()
)

小结

现在论文的图表绘制越来越“卷”,桑基图往往能够凭借其强大的数据流展示功能让审稿人和杂志编辑眼前一亮。希望通过本文的示例和优化步骤,你可以快速入门,欢迎使用本文的个性化设置优化你的图表!


感谢关注,你的支持是我不懈的动力!

科研代码
专注R和Python的数据分析。
 最新文章