r-用"networkD3"更改桑基图的彩色字体



我想更改彩色字体,或者在字体中添加阴影以提高可见性。然而,我还没有找到一种方法。一种选择是使用plotly,但当你把一个plotly对象放在一个闪亮的应用程序中并在手机中可视化时,你会失去交互式标签,所以networkD3可以更好地集成。唯一的问题是我很难把衣服个性化。我想更改字体颜色。

一个值得谴责的例子:

library(networkD3)
URL <- paste0('https://cdn.rawgit.com/christophergandrud/networkD3/',
'master/JSONdata/energy.json')
energy <- jsonlite::fromJSON(URL)
# Plot
sankeyNetwork(Links = energy$links, Nodes = energy$nodes, Source = 'source',
Target = 'target', Value = 'value', NodeID = 'name',
units = 'TWh', fontSize = 12, nodeWidth = 30)

文本元素可以修改我从包htmlwidgets添加的onRender脚本。此函数允许您运行额外的javascript函数,以便使用D3选择和修改元素。功能的结构是:

p <- onRender(myplot,'function(el, x){ 
...
}') 

使用该示例,可以使用d3.selectAll选择标签(这将返回每个元素;对于单个元素或仅第一个元素使用d3.select()(。

// Sankey selector for node labels
d3.selectAll(".node text")

可以使用style('some prop', 'some value')来修改<text>元素的颜色。例如,假设我们想将文本更改为blue

d3.selectAll(".node text").style("fill", "blue") // or hex, rgb, hsl, etc.

使用你上面的例子,下面是你如何写它

library(networkD3)
URL <- 'https://cdn.rawgit.com/christophergandrud/networkD3/master/JSONdata/energy.json'
energy <- jsonlite::fromJSON(URL)
# Plot
sankey <- sankeyNetwork(
Links = energy$links, Nodes = energy$nodes, Source = 'source',
Target = 'target', Value = 'value', NodeID = 'name',
units = 'TWh', fontSize = 12, nodeWidth = 30
)
# render with js
sankey_rendered <- htmlwidgets::onRender(sankey,
'function(el, x) {
d3.selectAll(".node text")
.style("fill", "blue");
}'
)
# show
sankey_rendered

如果您想对标签做更多的处理(例如,鼠标事件、单击(,请将D3选择结果分配给一个变量。

var labels = d3.selectAll(".node text");