r - 在 R 中保留 sankeyNetwork (networkD3) 的自定义节点放置
问题描述
我希望在 R 中自定义 sankeyNetwork (networkD3) 中节点的水平和垂直位置,并将网络导出为高分辨率图像。
我相信并使用了 CJ Yetman 的可重现示例(在 networkD3 的 sankeyNetwork 图中启用节点的水平移动),它允许用户在任何水平和垂直位置移动节点:
library(networkD3)
library(htmlwidgets)
ID <- 0:24
NodeGroup <- c(rep(1,8),2,5,rep(4,7),3,5,6,6,7,7,8,9)
name <- c("29581k","5279k","4218k","1917k","1356k","Ventas diversas: 116",
"Venta diversa: 97","Venta de: 141","Venta totales: 42705",
"Contribucion marginal: 18183", "17531k","1744k","1326k","1208k",
"526k","459k","14k","IIBB: 1714","Costo: 22808",
"Gastos directos: 6734", "Gastos distribudos: 2958","Resultado: 8851",
"Total Gastos: 9332","Imp. Gcias: 3098","Resultado Netto: 5.753")
nodes <- data.frame(ID, name, NodeGroup)
nodes$NodeGroup <- as.character(nodes$NodeGroup)
source <- c(0:7, rep(8,9), 10:16, rep(9,3), 19, 20, 21, 21)
target <- c(rep(8,8), 17, 10:16, 9, rep(18,7), 19:21, rep(22, 2), 23, 24)
value <- c(29581,5279,4218,1917,1356,116,97,141,1714,17531,1744,1326,1208,526,
459,14,18138,17531,1744,1326,1208,526,459,14,6374,2958,8851,6374,
2958,3098,5753)
group <- c(1:8, rep(9,8), 10, rep(19,7), rep(18,3), rep(23,2), rep(22,2))
links <- data.frame(source, target, value, group)
links$group <- as.character(links$group)
sn <- sankeyNetwork(Links=links, Nodes=nodes, Source='source', Target='target',
Value='value', NodeID='name', fontSize=18,
NodeGroup = "NodeGroup",
sinksRight = FALSE,
LinkGroup = "group",
#nodeWidth = 40,
#width=1500, height=500,
#margin = list("right"=250),
iterations = FALSE)
onRender(sn,
'
function(el, x) {
var sankey = this.sankey;
var path = sankey.link();
var nodes = d3.selectAll(".node");
var link = d3.selectAll(".link")
var width = el.getBoundingClientRect().width - 40;
var height = el.getBoundingClientRect().height - 40;
window.dragmove = function(d) {
d3.select(this).attr("transform",
"translate(" + (
d.x = Math.max(0, Math.min(width - d.dx, d3.event.x))
) + "," + (
d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))
) + ")");
sankey.relayout();
link.attr("d", path);
};
nodes.call(d3.drag()
.subject(function(d) { return d; })
.on("start", function() { this.parentNode.appendChild(this); })
.on("drag", dragmove));
}
'
)
可以在 RStudio 的查看器窗口中移动节点位置,但是使用该Export > Save as Image
选项或使用屏幕截图时分辨率较低:
我还尝试将 sankey 图导出到 html 文件,以便使用webshot
包进行自定义和导出为图像。但是,更改节点的水平位置被禁用,并且新的节点位置不会保留在图像导出中:
saveWidget(sn, "SankeyNetwork.html")
library(webshot)
webshot("SankeyNetwork.html", "sn.png", delay = 0.2)
如果有人能提出一种将自定义节点位置导出为高分辨率图像和 html 文件的方法,我将不胜感激。预先感谢您的帮助。
解决方案
推荐阅读
- java - Cassandra 在文本列中保存 JSON 数据
- python - 查找字典的平均等级
- scala - 将 Java CompletableFuture 转换为 Scala Future
- javascript - 如何将数组值相加,直到它们达到特定数字,然后使用添加的值创建对象?
- r - 如何在r中删除带有NA的尾巴?
- ios - 在生成报告后,如果测试失败,如何让詹金斯构建失败?
- r - 在 R 中重新合并一个数据框
- python - 总结所有图像的平均像素值:TypeError: 'numpy.float64' object is not iterable
- javascript - 如何将用户名从 django 中的用户模型传递到自动完成
- angularjs - 带有 angularJS 的 Webpack4 配置与 html 加载器问题