2010-10-09 54 views
5

我想創建一個圖(圖論),其中某些邊與其他邊具有不同的顏色,這將用於突出顯示圖中從一個頂點到另一個頂點的路徑。在Mathematica中創建具有不同顏色邊的圖

以下是一些具有不同顏色邊緣的示例http://demonstrations.wolfram.com/AGraphTheoryInterpretationOfTheSumOfTheFirstNIntegers/http://demonstrations.wolfram.com/Ramsey336/。我查看了這些源代碼,但這些解決方案看起來很複雜。我需要一個簡單的例子來工作。我想我需要使用EdgeRenderingFunction作爲GraphPlot的選項之一。

另外下「更多 信息」部分EdgeRenderingFunction文檔,它說:

Mathematica graphics

這看起來有用的,但遺憾的是沒有編碼的例子來試試。

採取這一非常字面上我試圖像

GraphPlot [東西{1 - > 2,2 - > 3,3 - > 4,4 - > 1,2 - > 4,4 - > 5,4 - > 6},VertexLabeling - >真,
EdgeRenderingFunction - >克[{1,2},{1, 2},紅色]]

但是,這是行不通的。這需要比這更聰明的東西。

回答

6

下面是一個示例,說明如何通過圖自動突出顯示特定路徑。

這是一個愚蠢的圖形,通過邊緣規則列表中指定:

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

Mathematica graphics

這裏是通過上圖我們想強調的路徑。

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

讓我們將路徑劃分爲邊,考慮到我們想突出顯示與其方向無關的邊。

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

我們寫一個EdgeRenderingFunction呈現兩種樣式之一的邊緣,這取決於無無論是在我們的名單與否。

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

最後,我們顯示結果。

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

Mathematica graphics

+0

簡單,優雅和普通+1 – 2010-10-10 02:26:41

+0

@ Mark McClure:Mathematica再次令我驚訝。如何在不傳遞任何參數的情況下調用函數erf?即使您在函數定義中創建了3個參數,我認爲它會在當前上下文中自動「發現」它們? – dbjohn 2010-10-10 09:34:52

+0

@dbjohn我還沒有調用函數;我只是告訴GraphPlot繪製邊緣時調用哪個函數。這裏有一個類似的例子:選擇[Range [9],EvenQ]。在這個例子中,EvenQ作爲參數傳遞給Select。選擇然後選擇那些EvenQ [n]返回True的整數n。 – 2010-10-10 10:58:22

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

呈現函數是一個回調函數,該函數接受3個參數。第一個是線的座標列表,第二個是邊的頂點,第三個是邊的標籤。

在Mathematica中,您可以使用(f[#1,#2,#3,...] &)創建一個匿名函數。

+0

,對於一個邊緣的工作。但是,假設我想爲覆蓋多個邊和頂點的路徑着色?我嘗試修改:'如果[#2 == {1,2,3,4,5} ...'和'如果[#2 == {{1,2},{3,4}} ... '但沒有工作。有任何想法嗎? – dbjohn 2010-10-09 20:32:25

+0

@dbjohn:參見[MemberQ](http://reference.wolfram.com/mathematica/ref/MemberQ.html)。 – kennytm 2010-10-09 20:33:49

+0

你正在建議我使用MemberQ,例如:'If [MemberQ [#2,{2,3,4,5}],Red ...'也就是說,如果頂點x,y,z在列表成員中所有頂點的顏色都是紅色的?該代碼不起作用,MemberQ無法將列表作爲第二個參數。我將需要更明確的方向。 – dbjohn 2010-10-09 21:11:25

相關問題