用`networkD3`更改Sankey图的颜色字体

时间:2020-03-20 17:25:27

标签: 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)

1 个答案:

答案 0 :(得分:1)

我可以通过添加onRender包中的htmlwidgets脚本来修改文本元素。此功能允许您运行其他javascript函数,以使用D3选择和修改元素。该函数的结构为:

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

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

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

可以使用<text>来修改style('some prop', 'some value')元素的颜色。例如,假设我们要将文本更改为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");