Estou tentando construir um gráfico Sankey com três camadas em R usando o pacote plotly (plotly_4.10.2). Embora as conexões da origem ao destino pareçam razoáveis a partir dos dados de "links", o próprio gráfico exibe as conexões incorretamente.
Por exemplo, "example.data" -> Gene3-Treatment- Catogory2 é exibido como Gene3-Treatment- Category1 , Connections for Gene8 também está errado. Devo fazer alguma reorganização dos rótulos antes de plotar?
Captura de tela do enredo
library(plotly)
# this is an example data
example.data <- data.frame(
genes = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5", "Gene6", "Gene7", "Gene8", "Gene9"),
conditions = c("Control", "Control", "Treatment", "Treatment", "Treatment", "Treatment", "Treatment", "Treatment", "Treatment"),
category = c("Category1", "Category1", "Category2", "Category2", "Category2", "Category2", "Category2", "Category1", "Category2")
)
nodes <- data.frame(name = unique(c(as.character(example.data$genes),
as.character(example.data$conditions),
as.character(example.data$category))))
links <- data.frame(source = match(example.data$genes, nodes$name) - 1,
target = match(example.data$conditions, nodes$name) - 1,
stringsAsFactors = FALSE)
links <- rbind(links,
data.frame(source = match(example.data$conditions, nodes$name) - 1,
target = match(example.data$category, nodes$name) - 1,
stringsAsFactors = FALSE))
plotly::plot_ly(
type = "sankey",
domain = list(x = c(0,1),
y = c(0,1)),
orientation = "h",
customdata = nodes$name,
node = list(
label = nodes$name,
pad = 15,
thickness = 15,
line = list(color = "black",
width = 0.5)),
link = list(source = links$source,
target = links$target,
value = rep(1, nrow(links))
))
Talvez tente traçar nesta ordem
condition -> genes -> category
::As conexões estão realmente corretas, o diagrama de Sankey exibe os fluxos entre o Estado 1 (nó de origem)
genes
e o Estado 2 (nó de destino)conditions
e então, separadamente, os fluxos entre o Estado 2conditions
e o Estado 3category
.Faz mais sentido se você passar o mouse sobre os fluxos, verá que, por exemplo, um valor de
Treatment
foi paraCategory1
. No entanto, só porque o fluxo parece estar vinculadoGene3
não significa necessariamente que esteja: