如何在R中绘制类似PowerBI样式的美观ribbon chart
R 绘制PowerBI风格Ribbon Chart 最新落地方案
PowerBI 原生Ribbon Chart(丝带图)的核心逻辑是:沿时间/顺序轴对分类项做动态排名,相邻节点同分类的上下边界用平滑丝带连接,丝带高度匹配分类当期数值,丝带颜色固定绑定对应分类。5年前的老方案普遍存在手动计算边界误差大、平滑效果差、配色错位的问题,目前用两个持续维护的R包可以直接产出视觉效果对齐的结果,不需要复杂的自定义计算。
方案1:highcharter(交互版,效果与PowerBI匹配度最高)
highcharter 是Highcharts的官方R绑定,最新版本原生支持丝带流图逻辑,不需要手动做排名、插值、边界计算,传入长表数据即可直接出图,支持悬浮提示、图例交互等和PowerBI一致的功能。
- 安装包
install.packages("highcharter") - 可直接运行的示例代码
library(highcharter) # 加载示例数据集 df <- data.frame (model = c("A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J"), Year = c(2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018), sales = c(450,678,456,344,984,456,234,244,655,789,234,567,234,567,232,900,1005,1900,450,345,567,235,456,345,144,333,555,777,111,444,222,223,445,776,331,788,980,1003,456,434)) # 绘制丝带图 hchart(df, "streamgraph", hcaes(x = Year, y = sales, group = model)) %>% hc_plotOptions( streamgraph = list( fillOpacity = 0.8, stacking = "normal", ribbon = list(enabled = TRUE), # 开启跨节点丝带连接*核心参数* curveFactor = 0.6 # 控制丝带平滑度,数值越大弧度越大 ) ) %>% hc_xAxis(categories = unique(df$Year), tickmarkPlacement = "on") %>% hc_yAxis(visible = FALSE) %>% # 可按需隐藏y轴,匹配参考图风格 hc_legend(align = "right", verticalAlign = "middle")
运行后生成的交互图丝带平滑无错位,分类颜色固定,排名变化的连接逻辑和PowerBI完全一致。
方案2:ggplot2 + ggstream(静态矢量图版,适合报告/论文输出)
如果需要ggplot2体系的静态可编辑矢量图,使用2023年仍在迭代的ggstream包即可,比早年ggalluvial实现的冲积图美观度高很多,可完全自定义主题、标签、配色。
- 安装依赖
install.packages(c("ggplot2","ggstream","dplyr")) - 可直接运行的示例代码
library(ggplot2) library(ggstream) # 加载示例数据集 df <- data.frame (model = c("A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J","A","B","C","D","E","F","G","H","I","J"), Year = c(2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2017,2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018), sales = c(450,678,456,344,984,456,234,244,655,789,234,567,234,567,232,900,1005,1900,450,345,567,235,456,345,144,333,555,777,111,444,222,223,445,776,331,788,980,1003,456,434)) ggplot(df, aes(x = Year, y = sales, fill = model)) + geom_stream(type = "ridge", bw = 0.75, sorting = "onset", alpha = 0.8) + # 如需直接在丝带上显示分类标签可取消下一行注释 # geom_stream_label(aes(label = model), size = 3.5) + scale_x_continuous(breaks = unique(df$Year)) + theme_minimal() + theme( axis.text.y = element_blank(), axis.title = element_blank(), panel.grid = element_blank(), legend.position = "right" )
调优提示
- 需要完全对齐PowerBI默认配色时,直接提取PowerBI默认可视化的十六进制色值,传给
highcharter的hc_colors()参数,或ggplot的scale_fill_manual()参数即可 - 静态图的丝带平滑度通过
geom_stream()的bw参数调整,数值越大丝带越平滑 - 两个方案均支持按需求调整丝带透明度、边框、标签位置,不存在老方案中无法修改样式的问题
内容的提问来源于stack exchange,提问作者user18948933
相关产品推荐
相关产品推荐

