2010-03-19 39 views
36

Tôi đang sử dụng graphviz (dấu chấm) để tạo biểu đồ mà bạn có thể xem bên dưới. Các nút ở góc dưới bên trái (hình elip màu đỏ) gây khó chịu vì các cạnh của nó vượt qua một số cạnh của nút liền kề. Có cách nào để hạn chế vị trí nút đến một khu vực nhất định không?Cách kiểm soát vị trí nút trong graphviz (ví dụ: tránh giao cắt cạnh)

Cám ơn ý tưởng của bạn

graph with edge crossing several other edges http://i39.tinypic.com/e6od8z.png

Trả lời

9

Tôi không biết về bất kỳ phương tiện mà để kiểm soát các vị trí của các nút riêng biệt. Nó không thực sự có ý nghĩa, bởi vì để làm điều đó bạn cần biết biểu đồ cuối cùng sẽ trông như thế nào, nhưng việc đặt một nút theo cách thủ công sẽ thay đổi cách phần còn lại của biểu đồ được hiển thị.

Tôi đã giải quyết vấn đề này bằng cách thay đổi thứ tự các nút của tôi được xác định trong tệp .dot và tinh chỉnh các thuộc tính nodesepranksep ở cấp biểu đồ. Đó là một quá trình sàng lọc - tinh chỉnh một vài điều tại một thời điểm cho đến khi có vẻ đúng.

Bạn cũng có thể hiển thị biểu đồ dưới dạng SVG, sau đó nhập biểu đồ vào Visio (hoặc trình chỉnh sửa khác) và sắp xếp lại các nút bạn không hài lòng theo cách thủ công.

+1

Tôi không nghĩ rằng Visio có thể chỉnh sửa một svg chung, nhưng Inkscape có thể. –

+0

@GringoSuave: Inkscape có thể thực sự, nhưng các cạnh không tuân theo nếu bạn di chuyển một nút. Điều này làm cho nó không thực tế cho bất cứ điều gì nhưng rất ít nút. –

+2

Điều này không chính xác và không nên là câu trả lời được chấp nhận. Có câu trả lời dưới đây với 30 và 20 phiếu tương ứng mỗi phiếu sẽ là một câu trả lời được chấp nhận tốt. –

22

@Jannis, trong trường hợp bạn vẫn còn quan tâm đến câu trả lời cho điều này, có thực sự là một cách để kiểm soát vị trí nút riêng lẻ - bạn sử dụng "pos" thuộc tính:

http://www.graphviz.org/doc/info/attrs.html#d:pos

như một ví dụ về điều này, bạn có thể viết:

n [pos="3,5!"]; 

Điều đó sẽ buộc nút n để được ở chính xác (3,5).

Tuy nhiên, điều này chỉ hoạt động với công cụ bố cục "fdp" và "neato".

+18

Thuộc tính 'pin' (!), Là" fdp, neato only "(nó không hoạt động với dấu chấm). Vì vậy, việc sử dụng 'pos' là vô nghĩa với dấu chấm trừ khi bạn bỏ qua công cụ bố cục chấm. – nobar

+1

@nobar: Hmm, nhìn vào tài liệu một lần nữa có vẻ như bạn đang đúng - xấu của tôi, xin lỗi. –

+0

Tôi nhận thấy điều đó! cũng không hoạt động với fdp, mặc dù nó hoạt động với neato. Ngoài ra, đối số -s cần quản lý việc chia tỷ lệ các tọa độ được đưa ra trong thuộc tính "pos" (mặc định là 72.0) dường như không hoạt động (nó gây ra các segfaults). Tóm lại: chia tất cả các số của thuộc tính 'pos' thành 72.0 và sử dụng' neato' hoạt động! –

35

Bạn có thể tạo một ràng buộc vô hình, làm cho nút màu đỏ xuất hiện ở bên trái của tất cả các nút khác.

redNode -> leftmostNode [style=invis]; 

Trước:

before

Sau:

after

+1

Điều đó giải quyết được vấn đề của tôi. Tôi chỉ muốn thứ gì đó xuất hiện ở phía bên kia của thứ khác. Cảm ơn bạn. –

5

Tôi thích [style=invis] lừa @smokris' cho việc thuyết phục graphviz để đặt mọi thứ mà bạn muốn họ, bằng cách thêm cạnh ảnh hưởng đến bố cục nhưng không hiển thị.


Bí quyết khác là constraint attribute, cho phép bạn thêm các cạnh hiển thị nhưng không ảnh hưởng đến bố cục.

Nếu thêm một cạnh mới làm lộn xộn đồ thị của bạn, hãy đặt [constraint=false] trên cạnh đó: bây giờ graphviz sẽ bỏ qua nó khi đặt nút.

Nếu cạnh false, cạnh không được sử dụng để xếp hạng các nút.Ví dụ, trong đồ thị

digraph G { 
    a -> c; 
    a -> b; 
    b -> c [constraint=false]; 
} 

cạnh b -> c không thêm một hạn chế trong quá trình phân cấp bậc, do đó hạn chế duy nhất là một được trên b và c, năng suất đồ thị:

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