Создание древовидной диаграммы из текста с вкладками в R
Я хочу сделать дерево / блок-схему следующих данных, которые имеют правильные отступы с вкладками:
Vertebrates
fish
goldfish
clownfish
amphibian
frog
toad
reptiles
snake
lizard
turtle
tortoise
birds
sparrow
crow
parrot
mammals
dog
cat
horse
whale
Как я могу преобразовать эти данные дерева в потоковую диаграмму (со стрелками, идущими сверху вниз или слева направо) (правильная позиция определяется путем подсчета количества вкладок в каждой строке). Я полагаю, что это можно сделать с помощью пакета "схема" ( блок-схема графика перехода из состояний, http://cran.r-project.org/web/packages/diagram/index.html), но не смог определить точные шаги. Спасибо за вашу помощь.
Примерный желаемый результат приведен ниже. Там могут быть коробки вокруг текста.
РЕДАКТИРОВАТЬ: В идеале это должно быть гибкое решение, чтобы оно работало, если уровни добавлены или удалены. Например добавление 2 типов воробьев:
Vertebrates
fish
goldfish
clownfish
amphibian
frog
toad
reptiles
snake
lizard
turtle
tortoise
birds
sparrow
house
factory
crow
parrot
crane
mammals
dog
cat
horse
whale
dat = structure(list(V1 = c("Vertebrates", NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA), V2 = c(NA, "fish", NA, NA, "amphibian", NA, NA, "reptiles",
NA, NA, NA, NA, "birds", NA, NA, NA, NA, NA, NA, "mammals", NA,
NA, NA, NA), V3 = c(NA, NA, "goldfish", "clownfish", NA, "frog",
"toad", NA, "snake", "lizard", "turtle", "tortoise", NA, "sparrow",
NA, NA, "crow", "parrot", "crane", NA, "dog", "cat", "horse",
"whale"), V4 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, "house", "factory", NA, NA, NA, NA, NA, NA, NA, NA
)), .Names = c("V1", "V2", "V3", "V4"), class = "data.frame", row.names = c(NA,
-24L))
>
1 ответ
Это довольно запутанный способ использования igraph
, Нам нужно расположить ваши данные в две колонки, from
а также to
с указанием стрелки от -> до.
library(zoo)
library(igraph)
# read tab delimited data - keep structure by setting "" to missing
# (would of been great if you had given this in a format easier to use)
dat <- read.table("test.txt", sep="\t", header=FALSE, fill=TRUE,
na.strings="", strip.white=TRUE, stringsAsFactors=FALSE)
head(dat, 7)
# V1 V2 V3
#1 Vertebrates <NA> <NA>
#2 <NA> fish <NA>
#3 <NA> <NA> goldfish
#4 <NA> <NA> clownfish
#5 <NA> amphibian <NA>
#6 <NA> <NA> frog
#7 <NA> <NA> toad
Подготовить данные к графику
# carry forward the last value in first two columns to impute missing
dat[1:2] <- sapply(dat[1:2], na.locf, na.rm=FALSE)
dat <- na.omit(dat)
# get edges for graph - we want two columns (from and to) for each edges
edges <- rbind(dat[1:2],setNames(dat[2:3],names(dat[1:2])))
# create graph
g <- graph.data.frame(edges)
# Plot graph
E(g)$curved <- 0
plot.igraph(g, vertex.size=0, edge.arrow.size=0 ,
layout=-layout.reingold.tilford(g)[,2:1])
Данные, как будут лучшие способы сделать это!
dat <- structure(list(V1 = c("Vertebrates", NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), V2 = c(NA,
"fish", NA, NA, "amphibian", NA, NA, "reptiles", NA, NA, NA,
NA, "birds", NA, NA, NA, "mammals", NA, NA, NA, NA), V3 = c(NA,
NA, "goldfish", "clownfish", NA, "frog", "toad", NA, "snake",
"lizard", "turtle", "tortoise", NA, "sparrow", "crow", "parrot",
NA, "dog", "cat", "horse", "whale")), .Names = c("V1", "V2",
"V3"), class = "data.frame", row.names = c(NA, -21L))
РЕДАКТИРОВАТЬ: обновить после новых данных
Вызов ваших обновленных данныхdat2
# To prepare the data
# carry forward the last value in columns if lower level (col to the right)
# is non-missing
dat2[1] <- na.locf(dat2[1], na.rm=FALSE)
for(i in ncol(dat2):2) {
dat2[[i-1]] <- ifelse(!is.na(dat2[[i]]), na.locf(dat2[[i-1]], na.rm=F),
dat2[[i-1]])
}
# get edges for graph
edges <- rbind(na.omit(dat2[1:2]),
do.call('rbind',
lapply(1:(ncol(dat2)-2), function(i)
na.omit(setNames(dat2[(1+i):(2+i)],
names(dat2[1:2])))))
)
Затем продолжайте, как и прежде, чтобы дать