2011-01-12 28 views
21

Tôi đang cố gắng sử dụng dấu chấm Graphviz (nhưng sẵn sàng sử dụng cái gì khác) để tạo biểu đồ với một "dòng chính" dài của các nút, và nhiều nhánh nhỏ. Tôi muốn dòng chính được thẳng từ trái sang phải, với các nhánh nhỏ ở trên hoặc dưới nó. Tuy nhiên, Graphviz "cân bằng" hai chi nhánh, vì vậy tôi kết thúc với một đồ thị quanh co.Buộc các nút "dòng chính" thành một đường thẳng trong Graphviz (hoặc các lựa chọn thay thế)

Để minh họa, đây là một phác thảo tương tự như những gì tôi hiện đang nhận được:

Current Graph

Và đây là những gì tôi thực sự muốn:

Wanted graph

Có cách nào để buộc hoặc khuyến khích Graphviz tạo một biểu đồ như đồ thị thứ hai? Tôi có thể sử dụng các nhánh thứ hai "giả" để nó có bố cục 3 chiều, và sau đó ẩn/xóa các núm vú giả sau đó, nhưng nếu có một lựa chọn tốt hơn sẽ thích hợp hơn.

Trả lời

28

Đây là một giải pháp sử dụng các cân thuộc tính của các cạnh:

digraph G { 
    rankdir="LR"; 
    node[width=0.15, height=0.15, shape=point]; 
    edge[weight=2, arrowhead=none]; 
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8; 
    edge[weight=1]; 
    2 -> 9 -> 10 ; 
    5-> 11 -> 12; 
} 

Kết quả:

graphivz

+0

Điều đó dường như thực hiện thủ thuật, nhưng dường như yêu cầu biểu đồ phải được hướng dẫn. Mỏ được định nghĩa là không bị hư hại, nhưng không có lý do cụ thể nào cần thiết, vì vậy nó sẽ hoạt động. Cảm ơn. –

+0

Tôi không chắc liệu điều này có thể thực hiện được như một đồ thị vô hướng hay không, nhưng tôi rất vui vì điều này phù hợp với bạn. – marapet

+2

Cách tốt nhất để tạo biểu đồ không được chiếu là sử dụng biểu đồ được hướng dẫn nhưng đặt 'cạnh [dir =" none "]'. Một tùy chọn khác là 'dir =" back "', sử dụng hướng '->' để bố trí biểu đồ nhưng vẽ mũi tên chỉ hướng ngược lại. –

28

Một giải pháp thứ hai sử dụng nhóm thuộc tính của nút - một lần nữa một đạo diễn biểu đồ:

Từ thứ e graphviz dot tham khảo:

Nếu các điểm kết thúc của một cạnh thuộc về các cùng nhóm, tức là đã thuộc tính cùng nhóm, các thông số được thiết lập để cửa tránh và giữ các cạnh thẳng .

Vì vậy, ở đây chúng tôi đi:

digraph g{ 
    rankdir="LR"; 
    node[width=0.15, height=0.15, shape=point, group=main]; 
    edge[arrowhead=none]; 
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8; 
    node[group=branches]; 
    2 -> 9 -> 10; 
    5 -> 11 -> 12; 
} 

Output là chính xác giống như trong câu trả lời đầu tiên của tôi.

+0

Cảm ơn, tôi đánh giá cao việc bạn đưa ra giải pháp thay thế, mặc dù tôi đã chấp nhận giải pháp khác. Tôi vẫn còn khá mới với Graphviz, vì vậy thật tuyệt khi thấy những cách có thể để đạt được những thứ như thế này. –

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