rsankey-diagramriverplot

Sankey plot with the riverplot package


Enchanté.

EDIT: Solution

As pointed out by MartineJ and emilliman5, nodes should be uniquely labelled (below).

library("riverplot")
nodes<-structure(list(ID = c("2011+", "2011-", "2016+", "2016-"), x = c(20, 
20, 30, 30), y = c(50, 40, 50, 40)), class = "data.frame", row.names = c(NA, 
-4L))
edges<-structure(list(N1 = c("2011+", "2011-", "2011+", "2011-"), N2 = 
c("2016+", "2016-", "2016-", "2016+"), Value = c(461, 7, 0, 46)), class = 
"data.frame", row.names = c(NA, -4L))

river <- makeRiver(nodes,edges)
riverplot(river)

I've been toying to plot a Sankey diagram/riverplot (using the riverplot package) of how cancer registrations evolve over time, though this code has bought me little success so far. Could anyone possibly direct me on the faults of this code?

Warning message: In checkedges(x2$edges, names(x2)) : duplicated edge information, removing 1 edges

Here is the suspect code:

library(“riverplot”)

edges<-structure(list(N1 = c("+", "-", "+", "-"), N2 = c("+", "-", "-", "+"), Value = c(664L, 50L, 0L, 46L)), .Names = c("N1", "N2", "Value"), class = "data.frame", row.names = c(NA, -4L))

nodes = data.frame(ID = unique(c(edges$N1, edges$N2)), stringsAsFactors = FALSE)

nodes$x = c(1,2)
rownames(nodes) = nodes$ID

rp <- list(nodes=nodes, edges=edges)

class(rp) <- c(class(rp), "riverplot")

plot(rp)

And the data, which is included in code:

N1    N2    Value
 +     +     664
 -     -      50
 +     -       0
 -     +      46

Eternally grateful.


Solution

  • Your nodes need to be named uniquely and then use the nodes$labels to change it back:

    library(riverplot)
    
    edges<-structure(list(N1 = c("+", "-", "+", "-"), N2 = c("+", "-", "-", "+"), Value = c(664L, 50L, 0L, 46L)), .Names = c("N1", "N2", "Value"), class = "data.frame", row.names = c(NA, -4L))
    edges$N1 <- paste0(edges$N1, "a")
    edges$N2 <- paste0(edges$N2, "b")
    nodes = data.frame(ID = unique(c(edges$N1, edges$N2)), stringsAsFactors = FALSE)
    
    nodes$x = c(1,1,2,2)
    nodes$labels <- as.character(substr(nodes$ID, 1, 1))
    rownames(nodes) = nodes$ID
    
    rp <- list(nodes=nodes, edges=edges)
    
    class(rp) <- c(class(rp), "riverplot")
    
    plot(rp)
    

    enter image description here