2012-12-19 15 views
25

Tôi đang cố gắng tạo biểu đồ bằng cách sử dụng dữ liệu giống cây, nơi các nút thường được chia thành> 2 cạnh. Tôi đã thử các bố cục khác nhau và tôi thấy rằng tham số layout.reingold.tilford sẽ tạo ra các biểu đồ giống cây với dữ liệu không phân nhánh. Tuy nhiên, kết quả đầu ra không đặc biệt hấp dẫn. Tôi thà sử dụng cái gì đó như layout.lgl hoặc layout.kamada.kawai vì chúng tạo ra nhiều cấu trúc xuyên tâm hơn. Tôi không thể thấy cách thay đổi các tham số trong R sao cho các cây này không có các cạnh chồng chéo. Điều này có thể không?Bố cục nào tôi nên sử dụng để có được các cạnh không chồng chéo trong igraph?

Tôi đã nhập tệp dữ liệu đơn giản ở định dạng Pajek, với 355 nút và 354 cạnh. Tôi hiện đang in bằng cách sử dụng:

plot.igraph(g,vertex.size=3,vertex.label=NA,layout=layout.lgl) 

Điều này mang lại cho tôi sản lượng như thế này, đẹp, nhưng vẫn có các cạnh chồng chéo. Tôi đã đọc rằng bạn có thể tự sửa lỗi này bằng cách sử dụng tkplot, hoặc một chương trình khác như cytoscape, tuy nhiên tôi có một vài trong số này để xây dựng, và kích thước của chúng làm cho điều chỉnh thủ công một rắc rối.

Rất cám ơn. Here is an example of the output I get

Trả lời

11

layout.reingold.tilford có thông số được gọi là circular. Đặt điều này thành TRUE sẽ chuyển đổi bố cục cuối cùng thành bố cục hình tròn bằng cách xử lý toạ độ X làm góc (sau khi thay đổi tỷ lệ phù hợp) và tọa độ Y làm bán kính. Trớ trêu thay, điều này không đảm bảo rằng sẽ không có cửa cạnh cuối cùng, nhưng nó hoạt động độc đáo nếu subtrees của bạn không phải là cực kỳ rộng so với phần còn lại của đồ thị:

> g <- barabasi.game(100, directed=F) 
> layout <- layout.reingold.tilford(g, circular=T) 
> plot(g, layout=layout) 
18

Bạn có thể muốn thử layout.fruchterman.reingold() . Nó dường như làm một công việc tốt giữ cho các cạnh từ qua. Tôi đã thử nghiệm nó với một phiên bản 355 nút của đồ thị barabasi được gợi ý bởi @ Tamás.

library(igraph) 

g = barabasi.game(355, directed=FALSE) 

png("plot1.png", height=6, width=12, units="in", res=200) 
par(mfrow=c(1, 2)) 

plot.igraph(g,vertex.size=3,vertex.label=NA, 
    layout=layout.fruchterman.reingold(g, niter=10000)) 
mtext("layout.fruchterman.reingold, area = vcount^2", side=1) 

plot.igraph(g,vertex.size=3,vertex.label=NA, 
    layout=layout.fruchterman.reingold(g, niter=10000, area=30*vcount(g)^2)) 
mtext("layout.fruchterman.reingold, area = 30 * vcount^2", side=1) 

dev.off() 

enter image description here

+3

Thông báo cảnh báo: Trong layout_with_fr (danh sách (355, FALSE, c (1, 2, 3, 4, 5, 6, 7, 8, 9,: Đối số 'khu vực 'không được chấp nhận và không có hiệu lực – EngrStudent

+0

@bdemarest: Bạn có bất kỳ đề xuất nào về việc sử dụng thay vì đối số" khu vực "không?" Khu vực "không còn được dùng nữa và tôi không thể tạo lại giải pháp của bạn ngay bây giờ. – nilsole

+0

'? layout_with_fr' coolexp, maxdelta, area, repulserad \t Các đối số này không được hỗ trợ từ igraph phiên bản 0.8.0 và bị bỏ qua (với cảnh báo) – pengchy

16

Chỉ muốn nói thêm một chút nhưng đại diện của tôi là quá thấp. Phương thức mà @bdemarest được đăng không hoạt động trên igraph phiên bản> 0.7. Phiên bản mới hơn không hỗ trợ thông số area, vì vậy tôi không thể có được hiệu ứng tương tự. Và nhận được phiên bản cũ để xây dựng đã cho tôi một thời gian, vì vậy tôi mặc dù tôi muốn chia sẻ một số hiểu biết. Bạn có thể cài đặt thủ công igraph 0,7 từ nguồn nếu bạn tải xuống từ igraph nightly builds. Trên máy tính của tôi (Mac OS 10.10), tôi gặp phải một số sự cố khi xây dựng nó, do gfortran, vì vậy tôi đã tìm thấy this link giải quyết được sự cố. Hy vọng rằng sẽ giúp bất kỳ ai muốn tạo biểu đồ tương tự trong R.

+1

Đã gửi cho bạn một số repo ... :) – Aminadav

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