Почему мой речной участок так странно выглядит?

Я пытаюсь сгенерировать речной график, но вывод, который у меня выглядит, выглядит так, как будто края идут с неправильной стороны каждого столбца, что затрудняет интерпретацию. введите описание изображения здесь

Данные, которые я использую:

края:

       N1       N2      Value
1     off    off.1 0.77149877
2    weak    off.1 0.47474747
3  medium    off.1 0.17537313
4  strong    off.1 0.03603604
5     off    low.1 0.06879607
6    weak    low.1 0.26262626
7  medium    low.1 0.13432836
8  strong    low.1 0.01351351
9     off medium.1 0.12530713
10   weak medium.1 0.23232323
11 medium medium.1 0.54850746
12 strong medium.1 0.20720721
13    off strong.1 0.03439803
14   weak strong.1 0.03030303
15 medium strong.1 0.14179104
16 strong strong.1 0.74324324

узлы:

        ID x y
1      off 1 4
2     weak 1 3
3   medium 1 2
4   strong 1 1
5    off.1 2 4
6    low.1 2 3
7 medium.1 2 2
8 strong.1 2 1

и код для сюжета:

library(RColorBrewer)
library(riverplot)
palette = paste0(brewer.pal(5, "Set2"), "60")
styles = lapply(nodes$y, function(n) {
  list(col = palette[n+1], lty = 0, textcol = "black")
})
names(styles) = nodes$ID
nlabels <- c(off = 'off', weak = 'weak', medium = 'medium',strong = 'strong', 
             off.1 = 'off', weak.1 = 'weak', medium.1 = 'medium', strong.1 = 'strong')
x <- makeRiver(nodes, edges, node_styles = styles, node_labels = nlabels)
plot(x)

1 ответ

Решение

Проблему можно решить, указав вертикальные положения узлов на графике (nodes_ypos опция):

x <- makeRiver(nodes, edges, node_styles = styles, node_labels = nlabels,
               node_ypos=1:4)
plot(x)

С использованием sankeyNetwork функция networkD3 Вы можете получить похожий (интерактивный) сюжет:

edges <- read.table(text="
n       N1       N2      Value
1     off    off.1 0.77149877
2    weak    off.1 0.47474747
3  medium    off.1 0.17537313
4  strong    off.1 0.03603604
5     off    low.1 0.06879607
6    weak    low.1 0.26262626
7  medium    low.1 0.13432836
8  strong    low.1 0.01351351
9     off medium.1 0.12530713
10   weak medium.1 0.23232323
11 medium medium.1 0.54850746
12 strong medium.1 0.20720721
13    off strong.1 0.03439803
14   weak strong.1 0.03030303
15 medium strong.1 0.14179104
16 strong strong.1 0.74324324
", header=T)

nodes <- read.table(text="
n        ID x y
1      off 1 4
2     weak 1 3
3   medium 1 2
4   strong 1 1
5    off.1 2 4
6    low.1 2 3
7 medium.1 2 2
8 strong.1 2 1
", header=T)

nodes$ID <- as.character(nodes$ID)
edges$N1 <- as.numeric(factor(edges$N1, levels=c("off","weak","medium","strong")))-1
edges$N2 <- as.numeric(factor(edges$N2, levels=c("off.1","low.1","medium.1","strong.1")))+3

library(networkD3)
sankeyNetwork(Links = edges, Nodes = nodes, Source = "N1",
             Target = "N2", Value = "Value", NodeID = "ID",
             iterations=0,
             units = "", fontSize = 12, nodeWidth = 30)

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