2010-10-09 33 views
5

Tôi muốn tạo một đồ thị (Lý thuyết đồ thị) trong đó các cạnh nhất định có màu khác với các cạnh khác, được sử dụng để làm nổi bật đường dẫn trong biểu đồ từ đỉnh này sang đỉnh khác .Tạo một biểu đồ với các cạnh của các màu khác nhau trong Mathematica

Dưới đây là một số ví dụ có các cạnh màu khác nhau http://demonstrations.wolfram.com/AGraphTheoryInterpretationOfTheSumOfTheFirstNIntegers/http://demonstrations.wolfram.com/Ramsey336/. Tôi đã xem xét mã nguồn cho những giải pháp này nhưng những giải pháp này có vẻ phức tạp. Tôi cần một ví dụ đơn giản để làm việc. Tôi nghĩ tôi cần sử dụng EdgeRenderingFunction làm một trong các tùy chọn cho GraphPlot.

Ngoài ra dưới EdgeRenderingFunction tài liệu trong "More Thông tin" phần nó nói:

Mathematica graphics

này trông rất hữu ích nhưng tiếc là không có ví dụ mã hoá để thử.

Lấy rằng rất nghĩa đen tôi đã cố gắng những thứ như

GraphPlot [{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1, 2 -> 4, 4 -> 5, 4 -> 6}, VertexLabeling -> Đúng,
EdgeRenderingFunction -> g [{1, 2}, {1, 2} , Red]]

Nhưng điều đó sẽ không làm việc. Nó sẽ có một cái gì đó thông minh hơn thế.

Trả lời

6

Dưới đây là ví dụ minh họa cách tự động làm nổi bật đường dẫn cụ thể thông qua biểu đồ.

Dưới đây là một biểu đồ ngớ ngẩn, xác định bởi một danh sách các quy tắc cạnh:

edges = Table[i -> Mod[1 + i^2, 10], {i, 0, 9}]; 
GraphPlot[edges, VertexLabeling -> True] 

Mathematica graphics

Dưới đây là một con đường thông qua đồ thị, chúng tôi muốn nhấn mạnh.

path = {0, 1, 2, 5, 6, 7, 0}; 

Hãy phân chia đường dẫn thành các cạnh, chúng tôi muốn làm nổi bật cạnh độc lập với hướng của nó.

edgesToHighlight = Partition[path, 2, 1]; 
edgesToHighlight = Join[edgesToHighlight, 
    Reverse /@ edgesToHighlight]; 

làm cho cạnh của một trong hai kiểu, tùy thuộc vào việc nó có nằm trong danh sách của chúng tôi hay không.

erf[pts_, edge_, ___] := If[MemberQ[edgesToHighlight, edge], 
    {Thick, Black, Arrow[pts, 0.1]}, {Darker[Red], Line[pts]}]; 

Cuối cùng, chúng tôi hiển thị kết quả.

GraphPlot[edges, EdgeRenderingFunction -> erf, 
    VertexLabeling -> True] 

Mathematica graphics

+0

đơn giản, thanh lịch và chung +1 –

+0

@ Mark McClure: Mathematica lại làm tôi ngạc nhiên. Làm thế nào bạn có thể gọi hàm 'erf' mà không truyền bất kỳ đối số nào cho nó? Mặc dù bạn đã tạo 3 tham số trong định nghĩa hàm, tôi cho rằng nó tự động "tìm" chúng trong ngữ cảnh hiện tại? – dbjohn

+0

@dbjohn Tôi chưa gọi hàm; Tôi chỉ đơn giản là nói với GraphPlot những gì chức năng để gọi khi nó vẽ các cạnh. Đây là một ví dụ tương tự: Chọn [Phạm vi [9], EvenQ]. Trong ví dụ này, EvenQ được chuyển làm đối số cho Select. Chọn sau đó chỉ chọn các số nguyên n mà EvenQ [n] trả về True. –

1
GraphPlot[ 
{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1, 2 -> 4, 4 -> 5, 4 -> 6}, 
VertexLabeling -> True, 
EdgeRenderingFunction -> (
    {If[#2 == {1, 2}, Red, Black], 
    Line[#1]} 
    &) 
] 

Mathematica graphics

Chức năng vẽ là một chức năng gọi lại, trong đó có 3 đối số. Thứ nhất là danh sách tọa độ của đường thẳng, thứ 2 là đỉnh của cạnh và thứ 3 là nhãn của cạnh.

Trong Mathematica bạn có thể tạo một hàm ẩn danh với (f[#1,#2,#3,...] &).

+0

đó làm việc cho một cạnh. Nhưng giả sử tôi muốn tô màu một con đường bao phủ nhiều hơn một cạnh và đỉnh? Tôi đã thử sửa đổi: 'Nếu [# 2 == {1, 2, 3, 4, 5} ...' và 'Nếu [# 2 == {{1, 2}, {3, 4}} ... 'nhưng không hiệu quả. Bất kỳ ý tưởng? – dbjohn

+0

@dbjohn: Xem [MemberQ] (http://reference.wolfram.com/mathematica/ref/MemberQ.html). – kennytm

+0

Bạn đang đề nghị tôi sử dụng MemberQ như: 'Nếu [MemberQ [# 2, {2, 3, 4, 5}], Red ...' có nghĩa là nếu các đỉnh x, y, z nằm trong các thành viên của danh sách của tất cả các đỉnh màu đỏ? Mã đó không hoạt động, MemberQ không thể lấy danh sách làm đối số thứ hai của nó. Tôi sẽ cần hướng rõ ràng hơn. – dbjohn

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