У вас должен быть какой-то способ идентифицировать те узлы слева по сравнению с теми, которые не являются (то есть что-то, чтобы идентифицировать узлы, к которым вы хотите применить специальное форматирование). Вы можете добавить эту информацию во фрейм данных ваших узлов, а затем не забудьте добавить ее обратно в объект htmlwdigets
после выполнения sankeyNetwork
, поскольку сохраняются только необходимые столбцы. Затем вы можете добавить пользовательский JavaScript с помощью htmlwidgets::onRender
, чтобы применить особый стиль только к этим текстовым узлам.
library(tibble)
library(dplyr)
library(tidyr)
library(networkD3)
library(htmlwidgets)
url <- 'https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/13_AdjacencyDirectedWeighted.csv'
data <- read.table(url, header = TRUE)
data_long <-
data %>%
rownames_to_column('source') %>%
as_tibble() %>%
pivot_longer(-source, 'target') %>%
filter(value > 0) %>%
mutate(target = gsub('\\.', ' ', target)) %>%
mutate(source = paste0('src_', source)) %>%
mutate(target = paste0('trgt_', target))
nodes <- data.frame(name = unique(c(data_long$source, data_long$target)), stringsAsFactors = FALSE)
nodes <- tibble(name = unique(c(data_long$source, data_long$target)),
target = grepl('trgt_', name))
data_long$IDsource <- match(data_long$source, nodes$name) - 1
data_long$IDtarget <- match(data_long$target, nodes$name) - 1
nodes$name <- sub('^.*_', '', nodes$name)
ColourScal ='d3.scaleOrdinal() .range(["#FDE725FF","#B4DE2CFF","#6DCD59FF","#35B779FF","#1F9E89FF","#26828EFF","#31688EFF","#3E4A89FF","#482878FF","#440154FF"])'
sn <- sankeyNetwork(Links = data_long, Nodes = nodes,
Source = "IDsource", Target = "IDtarget",
Value = "value", NodeID = "name",
sinksRight=FALSE, colourScale=ColourScal, nodeWidth=40, fontSize=13, nodePadding=20)
sn$x$nodes$target <- nodes$target
sn <- onRender(sn,
'
function(el) {
d3.select(el)
.selectAll(".node text")
.filter(d => d.target)
.attr("x", -6)
.attr("text-anchor", "end");
}
'
)
sn