2012-07-01 44 views
12

Tôi đã tìm kiếm xung quanh cách vẽ một cây gia đình nhưng không thể tìm thấy thứ gì đó mà tôi có thể sinh sản. Tôi đã tìm trong cuốn sách của Hadley về ggplot nhưng cũng giống vậy.Làm thế nào để vẽ cây gia đình trong R

Tôi muốn âm mưu một cây gia đình có như một nguồn một dataframe tương tự như sau:

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" 
) 

Có cách nào tôi có thể vẽ một cây gia đình với ggplot? Nếu không, làm thế nào tôi có thể âm mưu nó bằng cách sử dụng một gói phần mềm.

Khóa chính là 'id' và bạn kết nối với các thành viên khác của gia đình bằng cách sử dụng "id_father" và "id_mother".

+4

Bạn đã thử gì? Bạn có biết cách sử dụng R và đồ họa của nó không? Bạn đã xem bằng cách sử dụng igraph để đại diện cho dữ liệu của bạn và các phương pháp đồ họa của nó? Một cây gia đình là một loại đồ thị, vì vậy igraph và toàn bộ Mô hình đồ họa Task View sẽ là một nơi tốt để bắt đầu. Bạn đã đọc chưa? – Spacedman

+0

Có lẽ bạn có thể sửa đổi các ô trong [ggphylo] (https://github.com/gjuggler/ggphylo), một phần mở rộng của ggplot2 để tạo các ô cây phát sinh loài. – sckott

Trả lời

8

Như đã nêu trong các nhận xét, bạn nên thử igraph. Dưới đây là một khởi đầu nhanh chóng:

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

Không có bất kỳ tên, và các mũi tên đang đi theo hướng sai, nhưng bạn sẽ có thể đi từ đó.

+1

Cảm ơn nograpes. Tôi nhìn qua igraph nhưng không thể tìm ra nơi để bắt đầu. Ví dụ của bạn là một khởi đầu tốt. –

+0

Tôi có một câu hỏi khác. Tôi xoay xở để xoay cây 180 độ và đặt tên thay vì những con số trên đỉnh. Vấn đề là cây trở nên quá đông đúc. Có cách nào tôi cam xác định bố trí để đặt không gian nhiều hơn giữa các đỉnh trên trục x? –

+0

Thành thật mà nói, tôi chỉ học về 'igraph' vài ngày trước. Họ có một số tài liệu hay (http://igraph.sourceforge.net/) trên trang web của họ, tôi chắc chắn điều đó là có thể. – nograpes

0

Bạn đã thử gói kinship2 chưa?

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

Các vấn đề liên quan