2011-11-19 38 views
5

這裏是BBC動態graphics。我認爲可能在Mathematica中重現圖形。這個動態情節怎麼可能用mathematica?

enter image description here

在回答我們將看到在MMA提供一些迷人的圖形技巧的過程。這是在這裏提出問題的唯一原因。

更新:

我剛剛檢查了BBC使用簡單的JavaScript來做到這一點。他們手動製作了靜態圖片,甚至沒有使用基於Flash的事件處理。所以所有的圖片都是靜態的實體,一旦我們點擊一​​個國家,它就會生成一個獨特的圖像。對於其他國家,它顯示其他圖像。每個案例的單獨圖像可以通過PowerPoint,Visio甚至Photoshop生成。人們可以通過在瀏覽器中禁用JavaScript並重新加載頁面來檢查這一點。

據我所知,這些單張照片可以由MMA製成。一些答案顯示了人們如何做到這一點的正確方向。所以我接受迄今爲止最好的答案。

+4

大多數元素都可以在Mathematica中輕鬆找到。您可以使用'Arrow's,例如基於'BezierCurve'或'BSplineCurve's。可點擊的名稱可以通過'Appearance' - >「Frameless」''來實現。剩下的只是工作。也許圖形中箭頭的變化厚度可能難以再現。可能有必要避免使用「箭頭」,並從更基本的繪製原語構建它們。在問這個問題之前,你嘗試過什麼? –

+0

@ SjoerdC.deVries我沒有嘗試到目前爲止。剛纔在BBC看過這個消息,認爲這對於MMA練習課來說是一個很好的問題。我會盡力去做,但要讓別人看看。特別是那些在迷霧般的星期六早晨煩悶的人。 – PlatoManiac

+1

我認爲雖然這需要很多工作,但這不是一項太困難的任務。你需要在'EventHandler'中包裝圖形對象,點擊修改一些變量,並將整個'Graphics'放在'Dynamic'中,以便在這些變量發生變化時更新。 'HighlightGraph'對於簡化的解決方案非常有用。HighlightGraph [g,{Style [1 \ [DirectedEdge] 2,color]}]創建一個有向圖'g',然後執行'SetterBar [Dynamic [color],{Red,Green,Blue}]'''Dynamic @ ' – Szabolcs

回答

3

又一個首發:

a = Point[{0, 0}]; 
b = .75 Tuples[{1, -1}, 2][[{3, 1, 2, 4}]]; 
PieChart[ 
{ 
    Button[1, (a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{b[[1]], {0, 0}, #}] & /@ b})], 
    Button[1, (a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{b[[2]], {0, 0}, #}] & /@ b})], 
    Button[1, (a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{b[[3]], {0, 0}, #}] & /@ b})], 
    Button[1, (a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{b[[4]], {0, 0}, #}] & /@ b})], 
    } 
, 
SectorOrigin -> {Automatic, 1}, 
Epilog -> [email protected]] 

enter image description here

編輯更緊湊:

a = Point[{0, 0}]; 
b = .75 Tuples[{1, -1}, 2][[{3, 1, 2, 4}]]; 
PieChart[ 
ReleaseHold[Replace[Table[ 
    List[1, 
    ReplaceAll[ 
     Hold[a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{k, {0, 0}, #}] & /@ b}], k -> i]], 
    {i, b}], List -> Button, {2}, Heads -> True]] 
, 
SectorOrigin -> {Automatic, 1}, 
Epilog -> [email protected]] 
+0

(我想畫一段時間這樣的圖表......)事情是,OP沒有真正提到彎曲箭頭的寬度應該與它們所代表的流量成比例。這種類型的更詳細的圖表具有彎曲的箭頭「雙向」 - 顯示來自所有可能來源的流入和流出的大小。國際海事組織,在Mathematica中沒有銀彈......如果可以說,指定一條Line []將會更容易,這將改變寬度作爲In/Out大小的函數,這在兩端可能不同更復雜的例子。 – telefunkenvf14

+1

@tele我意識到可變箭頭寬度的東西,但也有很多其他更小和更大的細節在OP的圖表中。它可能需要很多時間才能解決所有問題,除此之外,它非常無聊。但是......我認爲你有一個很好的問題可以在這裏發佈......例如:「如何製作一個箭頭,其寬度沿着參數化寬度?」 –

+1

我有很多問題想問,但是要確保正確解釋我正在嘗試做的事情是非常繁瑣的。設計和集成問題也一直在我的腦海裏,這對於一個單一的問題來說是非常困難的,而且似乎是在推動SO的目標。我希望有一種有組織的方式(對於MMA用戶)來協調解決這些類型的「大」問題,並共同開發開源資源。海事組織,世界資源研究所確實需要以某種方式參與其中。外界對我們無法接近的知識感到沮喪。 – telefunkenvf14

3

這不是一個完整的答案,但它太長的評論。我鼓勵每個人都從中「竊取」,並完成它:-)

g = RandomGraph[{5, 12}, DirectedEdges -> True]; 

SetterBar[Dynamic[v], VertexList[g]] 

[email protected][ 
    g, {Style[Cases[EdgeList[g], v \[DirectedEdge] _], 
    Directive[Thick, Black]], Style[v, Red]}, 
    GraphLayout -> "CircularEmbedding", EdgeStyle -> [email protected], 
    VertexLabels -> "Name"] 

enter image description here

下一步是使用VertexShapeFunction與包裹在EventHandler更換SetterBar對象。

+1

我不喜歡圖形圖形中箭頭的晃動 –

+0

@Sjoerd也可以定製,'GraphPlot'具有不同的默認值。無論如何,這僅僅是一個起點,並不意味着什麼甚至接近最終的解決方案。也許那個人甚至不會使用圖表。我只是爲了讓其他人更容易入門而發佈(如果有人希望使用此功能)。 – Szabolcs

+0

@ SjoerdC.deVries感謝您的編輯。 – Szabolcs

4

一些更基本的步法此:

g[\[Alpha]_, \[Beta]_, color_] := Module[{t}, 
t = Graphics[{{Thickness[.03], Arrowheads[{.15}], color, 
    Arrow[ 
    BezierCurve[{{Cos[\[Alpha]], Sin[\[Alpha]]}, {0, 
     0}, {Cos[\[Beta]], Sin[\[Beta]]}}]]}}, 
PlotRange -> 1.5, ImageSize -> 512, Background -> None]; 
ImageCompose[Blur[t, 15], t] 
] 

one = Fold[ImageCompose, 
g[0, \[Pi]/3, Blue], {g[0, \[Pi]/2, Blue], g[0, \[Pi], Blue], 
g[0, 4 \[Pi]/3, Blue]}] 

two = Fold[ImageCompose, 
g[\[Pi]/3, 0, Yellow], {g[\[Pi]/3, \[Pi]/2, Yellow], 
g[\[Pi]/3, \[Pi], Yellow], g[\[Pi]/3, 4 \[Pi]/3, Yellow]}] 

DynamicModule[{pick = 1}, 
ClickPane[ 
    [email protected][pick == 1, one, two], 
    Function[{point}, If[First[point] < 256, pick = 1, pick = 2]]] 
] 

enter image description here

+0

美麗的陰影!恭喜你的第一個1000點BTW –

+0

謝謝。我想知道是否所有的基元都不應該有像這樣的更多的渲染指令({AbsoluteShadow [n],Arrow [pts]} –

+0

這也是一個比PlotLegends目前更好的陰影,但也許最好不要添加因爲它現在已經很慢了(請參閱http://stackoverflow.com/questions/8189742/plotlegends-makes-manipulate-ing-graphs-slow-to-a-crawl/8189802#8189802)。 –