2011-11-19 6 views
5

ここはBBCのダイナミックgraphicsです。 Mathematicaでグラフィックスを再現することは可能かもしれないと思っています。我々はMMAで利用可能ないくつかの魅力的なグラフィックストリックが表示されます答えるの過程でmathematicaでこのダイナミックプロットはどのように可能ですか?

enter image description here

。それがここで質問をする唯一の理由です。

更新:

私はちょうどBBCはそれを行うには、簡単なJavaScriptを使用していることを確認。彼らは静的な画像を手動で作成し、Flashベースのイベント処理を使用していません。したがって、すべての画像は静的なエンティティです。一度国をクリックすると、ユニークな画像が生成されます。他の国の場合は、他の画像を表示します。 PowerPoint、Visio、またはPhotoshopを使用して、それぞれのケースごとに個別のイメージを生成することができます。ブラウザでJavaScriptを無効にして、ページをリロードするだけでこれを確認できます。

私は、これらの1枚の写真はMMAから作成できることを理解しています。いくつかの答えは正しい方向性を示しています。だから私はこれまでに来た最高の答えを受け入れています。

+4

ほとんどの要素はMathematicaで簡単に見つけることができます。たとえば、 'BezierCurve'や' BSplineCurve'に基づいて 'Arrow'sを使うことができます。クリック可能な名前は 'Appearance - >" Frameless "という' Button'として実装できます。残りは単なる仕事です。おそらく、グラフィックス内の矢印の可変厚さは、再現するのが難しいかもしれません。 'Arrow'の使用を控え、より基本的な描画プリミティブから構築する必要があるかもしれません。あなたはこの質問をする前に何を試しましたか? –

+0

@ SjoerdC.deVries私はこれまで試みていませんでした。ちょうど今、BBCのニュースを読んで、それがMMAの練習レッスンのための良い問題だと思った。私はそれをしようとしますが、他の人にも見せたいと思っていました。特に霧のような土曜日の朝には退屈なものがあります。 – PlatoManiac

+1

これは多くの作業が必要ですが、それほど難しい作業ではないと思います。 'EventHandler'にグラフィックオブジェクトをラップし、いくつかの変数を変更して' Graphics'を 'Dynamic'に入れて、それらの変数が変更されたときに更新する必要があります。 'HighlightGraph'は単純化された解に対しては良いです。有向グラフ「g」を作成し、SetterBar [Dynamic [color]、{Red、Green、Blue}]を実行します。Dynamic @ HighlightGraph [g、{Style [1 \ [DirectedEdge] 2、color]}] ' – 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では実際には、曲線の矢印の幅は、それが表す流れに比例すると言われていません。このタイプのより精巧なダイアグラムには、両方向に向かって曲線状の矢印があり、可能なすべてのソースからの流れの出入りの大きさを示しています。 IMOでは、Mathematicaには銀色の弾丸はありません...もしIn/Outの大きさの関数として幅を変えるLine []を指定することができれば、試みるほうが簡単でしょう。より複雑な例があります。 – telefunkenvf14

+1

@tele可変幅幅のものを実現しましたが、OPのグラフには他にもたくさんの細かい詳細がありました。それはすべてそれらに対処するために多くの時間を要求するかもしれません、そしてそれ以外に、それは非常に退屈です。しかし、私はここに投稿するのにいい質問があると思います。「弧に沿ってパラメータ化された幅の矢印を作る方法」 –

+1

私は質問したいことがたくさんありますが、私が何をしようとしているのかを正しく説明することは非常に面倒です。デザインとインテグレーションの問題はいつも私の心の中にあります。これは一つの質問に詰め込まれることが多く、SOが意図しているものの限界を押し進めているようです。私は、これらのタイプの「大きな」問題の解決を調整し、オープンソースのものを一緒に作業するための組織化された方法(MMAユーザー用)があることを望みます。 IMO、WRIは本当に何らかの形で関与する必要があります。私は外側の壁に囲まれた知識に悩まされ、外では私たちには近づきません。 – 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

次のステップはSetterBarを交換するEventHandlerに包まれたオブジェクトとVertexShapeFunctionを使用している:-)それを完了します。

+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ポイントとおめでとう –

+0

ありがとう。私はすべてのプリミティブがこのようなレンダリング指示文を持っていないかどうか疑問に思っています({AbsoluteShadow [n]、Arrow [pts]} –

+0

これは現在 'PlotLegends'よりもはるかに良い影です。それは今のところそれほど遅いです(http://stackoverflow.com/questions/8189742/plotlegends-makes-manipulateing-graphs-slow-to-a-crawl/8189802#8189802を参照)。 –

関連する問題