Darren Thomas
Darren Thomas

Reputation: 5

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.

Upvotes: 0

Views: 982

Answers (2)

emilliman5
emilliman5

Reputation: 5956

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

Upvotes: 0

MartineJ
MartineJ

Reputation: 795

It looks like you're using the same value multiple times in N1 (and in N2). Try to make them all different (per column) and try again, f.i.:

N1: plus1 minus1 plus2 minus2

If you want to show only + and -: in makeRiver, there is an option **node_labels **

Upvotes: 1

Related Questions