2012-07-01 32 views
12

He estado buscando cómo trazar un árbol genealógico pero no he podido encontrar algo que pueda reproducir. He estado buscando en el libro de Hadley sobre ggplot pero la misma cosa.Cómo trazar el árbol genealógico en R

Quiero trazar un árbol genealógico que tiene como fuente una trama de datos similar a esto:

dput(head(familyTree)) 
structure(
    list(
    id = 1:6, 
    cnp = c("11", NA, "22", NA, NA, "33"), 
    last_name = c("B", "B", "B", NA, NA, "M"), 
    last_name_alyas = c(NA, NA, NA, NA, NA, "M"), 
    middle_name = c("C", NA, NA, NA, NA, NA), 
    first_name = c("Me", "P", "A", NA, NA, "S"), 
    first_name_alyas = c(NA, NA, NA, NA, NA, "F"), 
    maiden_name = c(NA, NA, "M", NA, NA, NA), 
    id_father = c(2L, 4L, 6L, NA, NA, 8L), 
    id_mother = c(3L, 5L, 7L, NA, NA, 9L), 
    birth_date = c("1986-01-01", "1963-01-01", "1964-01-01", NA, NA, "1936-01-01"), 
    birth_place = c("City", "Village", "Village", NA, NA, "Village"), 
    death_date = c("0000-00-00", NA, NA, NA, NA, "2007-12-23"), 
    death_reason = c(NA, NA, NA, NA, NA, "stroke"), 
    nr_brothers = c(NA, 1L, NA, NA, NA, NA), 
brothers_names = c(NA, "M", NA, NA, NA, NA), 
    nr_sisters = c(1L, NA, 1L, NA, NA, 2L), 
    sisters_names = c("A", NA, "E", NA, NA, NA), 
    school = c(NA, "", "", NA, NA, ""), 
    occupation = c(NA, "", "", NA, NA, ""), 
    diseases = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), 
    comments = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_) 
), 
    .Names = c("id", "cnp", "last_name", "last_name_alyas", "middle_name", "first_name", "first_name_alyas", "maiden_name", "id_father", "id_mother", "birth_date", "birth_place", "death_date", "death_reason", "nr_brothers", "brothers_names", "nr_sisters", "sisters_names", "school", "occupation", "diseases", "comments"), 
    row.names = c(NA, 6L), 
    class = "data.frame" 
) 

¿Hay alguna manera de trazar un árbol genealógico con ggplot? Si no, ¿cómo puedo trazarlo usando otro paquete?

La clave principal es 'id' y se conecta a otros miembros de la familia usando "id_father" e "id_mother".

+4

¿Qué has intentado? ¿Sabes cómo usar R y sus gráficos? ¿Has considerado usar igraph para representar tus datos y sus métodos gráficos? Un árbol genealógico es un tipo de gráfico, por lo que igraph y toda la Vista de tareas de Modelos gráficos sería un buen lugar para comenzar. ¿Ya has leído eso? – Spacedman

+0

Tal vez puedas modificar gráficas en [ggphylo] (https://github.com/gjuggler/ggphylo), una extensión de ggplot2 para hacer gráficas de árboles filogenéticos. – sckott

Respuesta

8

Como se señala en los comentarios, debe intentar igraph. Aquí es un comienzo rápido:

require(igraph) 
mothers=familyTree[,c('id','id_mother','first_name', 'last_name')] 
fathers=familyTree[,c('id','id_father','first_name', 'last_name')] 
mothers$name=paste(mothers$first_name,mothers$last_name) 
fathers$name=paste(fathers$first_name,fathers$last_name) 
names(mothers)=c('parent','id','first_name','last_name','name') 
names(fathers)=c('parent','id','first_name','last_name','name') 
links=rbind(mothers,fathers) 
links=links[!is.na(links$id),] 
g=graph.data.frame(links) 
co=layout.reingold.tilford(g, flip.y=F) 
plot(g,layout=co) 

enter image description here

No hay ningún nombre, y las flechas van en la dirección equivocada, pero usted debe ser capaz de ir de allí.

+1

Gracias nograpes. Miré por encima de igraph pero no pude averiguar por dónde empezar. Tu ejemplo es un buen comienzo. –

+0

Tengo otra pregunta. Pude girar el árbol 180 grados y colocar los nombres en lugar de los números en los vértices. El problema es que el árbol se llena de gente. ¿Hay alguna manera de especificar el diseño para colocar más espacios entre los vértices en el eje x? –

+0

Para ser sincero, solo me enteré de 'igraph' hace unos días. Tienen una buena documentación (http://igraph.sourceforge.net/) en su sitio web, estoy seguro de que es posible. – nograpes

0

¿Has probado el paquete kinship2?

library(kinship2) 
df <- data.frame(id = c(1,2,3,4,5,6), sex = c(1,2,1,2,2,2), dadid = c(0,0,0,0,1,3), momid = c(0,0,0,0,2,4), famid = 1) 
relation1 <- matrix(c(2,3,4,1), nrow = 1) 
foo <- pedigree(id = df$id, dadid = df$dadid, momid = df$momid, sex = df$sex, relation = relation1, famid = df$famid) 
ped <- foo['1'] 
plot(ped) 

you can see the resulting plot here

Cuestiones relacionadas