Сопоставление цветов и порядка притока и оттока на диаграмме sankeyNetwork

Я хотел бы переставить приток и отток на диаграмме Санки в соответствии с каждым источником. Например, среди выживших в течение 2 лет в локализованной группе ОП некоторые продолжают доживать до третьего года, в то время как другие подвергаются цензуре. Вместо того, чтобы сгруппировать все подвергнутые цензуре случаи, я хочу, чтобы диаграмма Сэнки разделяла приток в зависимости от источника. Другими словами, я хочу, чтобы поток от выживших был разделен на выживших и подвергнутых цензуре случаев, при этом цвета, обозначающие разные категории (например, красный, желтый, зеленый), были одинаковыми в соответствующих группах.

Вот мои данные;

library(networkD3)

# Define the node data 
nodes2 <- data.frame( 
No = 0:16, 
label = c( "Localized OP", "Localized CRT", "Localized NoTX", "Regional OP", "Regional CRT", "Regional NoTX", "Distant OP", "Distant CRT", "Distant NoTX", "Survived 2 yr", "Censored 2 yr", "Survived 3 yr", "Censored 3 yr", "Survived 4 yr", "Censored 4 yr", "Survived 5 yr", "Censored 5 yr" ) 
) 

# Define the links data 
links2 <- data.frame( 
Source = c( 0, 0, 9, 9, 11, 11, 13, 13, 1, 1, 9, 9, 11, 11, 13, 13, 2, 2, 9, 9, 11, 11, 13, 13, 3, 3, 9, 9, 11, 11, 13, 13, 4, 4, 9, 9, 11, 11, 13, 13, 5, 5, 9, 9, 11, 11, 13, 13, 6, 6, 9, 9, 11, 11, 13, 13, 7, 7, 9, 9, 11, 11, 13, 13, 8, 8, 9, 9, 11, 11, 13, 13 ), 
Target = c( 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16 ), 
Value = c( 4686, 340, 4069, 617, 3599, 470, 3134, 465, 43, 56, 21, 22, 15, 6, 12, 3, 487, 495, 340, 147, 263, 77, 208, 55, 6147, 1431, 4506, 1641, 3479, 1027, 2821, 658, 336, 658, 99, 237, 46, 53, 34, 12, 571, 2277, 288, 283, 207, 81, 158, 49, 831, 971, 367, 464, 201, 166, 130, 71, 917, 2940, 201, 716, 85, 116, 51, 34, 466, 4993, 164, 302, 119, 45, 95, 24 ) 
) 

links2$group <- as.factor(c(rep("A", 24), rep("B", 24), rep("C", 24))) 
nodes2$group <- as.factor(c(rep("A",3), rep("B", 3), rep("C", 3), "b", "c","b", "c","b", "c","b", "c" ) ) 

my_color <- 'd3.scaleOrdinal() .domain(["A", "B", "C", "b", "c"]) .range(["#941e34", "#e5b560", "#455f54", "#dfdfdd", "#504e49"])' 

sankeyNetwork(
Links = links2, 
Nodes = nodes2, 
Source = "Source", 
Target = "Target", 
Value = "Value", 
NodeID = "label", 
sinksRight=FALSE, 
nodeWidth=40, 
fontSize=13, 
nodePadding=20, 
LinkGroup = "group", 
colourScale=my_color, 
iterations = 0)

Рплот

Фактически, сайт Sankematic предлагает ту функцию, которую я хочу, но я не могу воспроизвести ее в R.

Сюжет сайта Санкематик

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете переопределить сортировку ссылок, внедрив собственный JavaScript, например...

sn <-sankeyNetwork(
  Links = links2, 
  Nodes = nodes2, 
  Source = "Source", 
  Target = "Target", 
  Value = "Value", 
  NodeID = "label", 
  sinksRight=FALSE, 
  nodeWidth=40, 
  fontSize=13, 
  nodePadding=20, 
  LinkGroup = "group", 
  colourScale=my_color, 
  iterations = 0)

javascript_string <- 
  'function(el, x){
    var nodes = this.sankey.nodes();
    
    nodes.forEach(function(node) {
      node.sourceLinks.sort((a, b) => a.group.localeCompare(b.group) );
      node.targetLinks.sort((a, b) => a.group.localeCompare(b.group) );
    });
    
    nodes.forEach(function(node) {
      var sy = 0, ty = 0;
      node.sourceLinks.forEach(function(link) {
        link.sy = sy;
        sy += link.dy;
      });
      
      node.targetLinks.forEach(function(link) {
        link.ty = ty;
        ty += link.dy;
      });
    });
    
    d3.select(el).select("svg").selectAll(".link").attr("d", this.sankey.link());
  }'

htmlwidgets::onRender(
  x = sn, 
  jsCode = javascript_string
)
#> PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.

Другие вопросы по теме