2011-03-30 103 views
14

我剛花了幾個小時試圖轉換使用Mathematica 7的GraphPlotsome old code以使用新的Mathematica 8 Graph函數。這似乎明智的,因爲新的圖形繪製是好得多,它有像AdjacencyMatrixKirchhoffMatrix事情內置的。Mathematica中的多圖形8

問題是,我無法弄清楚如何獲得與多個邊緣曲線在MMA的8個工作。

我作爲我的典型的例子使用的費曼圖表是兩個迴路真空圖表

GraphPlot[{1 -> 2, 1 -> 2, 1 -> 2}, MultiedgeStyle -> .5, 
      DirectedEdges -> True, VertexCoordinateRules -> {{-1, 0}, {1, 0}}] 

two-loop vacuum sunset graph

設法使類似的圖在MMA中8

Graph[{DirectedEdge[1, 2], DirectedEdge[1, 2], DirectedEdge[1, 2]}, 
     VertexCoordinates -> {{-1, 0}, {1, 0}}] 

產生了錯誤信息

Graph::supp: Mixed graphs and multigraphs are not supported. >> 

我如何構建(及一起工作)使用Mathematica 8的Graph[]對象類似的圖形?

編輯:這個問題仍然在數學9

+2

在Mma8中浮動的三種不同的圖形類型對象不會產生問題......尤其是因爲它們不能很好地一起玩。 – Simon 2011-03-30 11:00:34

回答

14

我經歷了一個類似的嘗試使用Graph的過程,發現它並不代替CombinatoricaGraphPlotGraph的最佳用途是將其用作存儲頂點+邊+座標的容器類型。

例如,來自Combinatorica教程的「算法圖論」的大部分函數不適用於新的Graph對象。當我與WRI開發人員討論Graph項目時,我的理解是提供Graph的所有Combinatorica函數並不是一個優先事項,因爲設計目標是提供以算法不可知的方式解決任務的方法。例如,您可能有方法爲新的Graph對象查找頂點覆蓋和圖形着色,但對於布雷拉茲着色和貪婪頂點覆蓋等算法特定任務,您可能總是需要推遲到Combinatorica

除了多圖形之外,某些圖形佈局不適用於Graph對象。你不能修復一些頂點座標,讓剩餘的自動佈局完成。此外,LayeredGraphPlot的佈局不可用,有時preferredGraphLayeredDrawing

,以獲得最佳的3個世界的方式是使用Graph對象作爲主要用於汽車圖形庫,使包裝的接受Graph對象

一些使用情況GraphPlotCombinatoricaGraphUtilities功能:

  • 您需要CombinatoricaGraphUtilities中的一些算法 - 製作包含someAlgorithm的對象,將其轉換爲邊緣列表或Combinatorica圖形(GraphUtilities'ToCombinatoricaGraph有幫助),運行該算法,將其轉換回Graph對象,注意從原始圖形對象設置正確的GraphStyleVertexCoordinates。由於衝突,確保CombinatoricaGraphUtilities沒有上下文路徑上,我do it使用$預

  • 你需要像here,或多邊圖的一些自定義圖表陰謀 - 讓接受Graph的包裝功能someGraphPlot對象,將其轉換爲正確的表示形式,然後使用GraphPlot或者爲此目的創建一個具有自定義頂點/邊緣形狀的臨時對象Graph。請注意,您可以使用SetProperty將屬性附加到邊緣,以便您可以以這種方式將Graph中的多圖形存儲起來。

  • 你想用的GraphPlot佈局之一,商店座標Graph - 使用功能類似here使用VertexCoordinates

這裏有一個notebook得到頂點從GraphPlot佈局座標,並將其存儲在Graph對象演示這些用例以及其他一些用例

+0

謝謝雅羅斯拉夫。所有的好建議和有趣的評論,所以我會給你「剔」。不幸的是,這個代碼比我想要做的還要多,目前我用得不多。希望在我回到這個項目的時候,世界資源研究所將填補空白(推斷他們的發佈週期,到明年我們應該有v9或v10)。 – Simon 2011-04-09 02:51:03

2

這些還不支持存在,我想:

In[201]:= AdjacencyGraph[{{0, 3}, {0, 0}}] 

During evaluation of In[201]:= Graph::supp: Mixed graphs and multigraphs are not supported. >> 

Out[201]= AdjacencyGraph[{{0, 3}, {0, 0}}] 

雖然這可能不是你希望得到的答案。

+0

我覺得很奇怪,這種類型的輸入不起作用 - 因爲支持加權鄰接矩陣。 – Simon 2011-04-03 02:00:02

8

的GraphPlot功能仍然在MMA工作8

多重圖均未Combinatorica的功能支持兩種。在adjecency矩陣中也很難實現。也許與EdgeWeight工作可能在計算?

對於繪製多個鏈接,我可以想象'EdgeShapeFunction'可能會幫助你。

ef[pts_List, e_] := 
Block[{g1 = 
    Insert[pts, (pts[[1]] + pts[[-1]])/ 
     2 + ({x, y}/5 /. 
     Solve[{Norm[{x, y}] == 1, (pts[[1]] - pts[[-1]]).{x, y} == 
      0}, {x, y}][[1]]), Round[(Length[pts] + 1)/2]], 
    g2 = Insert[ 
    pts, (pts[[1]] + pts[[-1]])/ 
     2 + (-{x, y}/5 /. 
     Solve[{Norm[{x, y}] == 1, (pts[[1]] - pts[[-1]]).{x, y} == 
      0}, {x, y}][[1]]), Round[(Length[pts] + 1)/2]]}, {Arrow[ 
    BSplineCurve[g1]], Arrow[BSplineCurve[g2]], Arrow[pts]}] 

Graph[{1 \[DirectedEdge] 2, 2 \[DirectedEdge] 3, 3 \[DirectedEdge] 1}, 
    EdgeShapeFunction -> ef] 

enter image description here

或用於選定的邊:

Graph[{1 \[DirectedEdge] 2, 2 \[DirectedEdge] 3, 3 \[DirectedEdge] 1}, 
    EdgeShapeFunction -> {3 \[DirectedEdge] 1 -> ef}] 

enter image description here

功能EF可以容易地參數化用於邊緣繪製的數目。

+0

謝謝Sjoerd。我可以想象勾起這樣一個'EdgeShapeFunction'來自動檢查整數加權邊緣 - 所以你的'eft'是非常有用的有用代碼。但是我現在完全失去了更新代碼的熱情......我稍後再回來,或者等待WRI清理他們的Graph代碼。 – Simon 2011-04-09 02:47:22