2011-11-19 8 views
5

Tutaj jest dynamiczny BBC graphics. Myślę, że możliwe jest odtworzenie grafiki w Mathematica.Jak ten dynamiczny wykres jest możliwy z matematyką?

enter image description here

W procesie odpowiadając ujrzymy kilka uroczych sztuczek graficznych dostępnych w MMA. To jedyny powód, by zadać to pytanie tutaj.

Aktualizacja:

Właśnie sprawdziłem, że BBC jest za pomocą prostego JavaScript, aby to zrobić. Ręcznie wykonali statyczne obrazy, a nawet nie korzystali z obsługi zdarzeń opartych na technologii Flash. Wszystkie zdjęcia są więc statycznymi obiektami i po kliknięciu jednego kraju generowany jest unikalny obraz. W przypadku innych krajów pokazuje inne obrazy. Oddzielne obrazy dla każdego przypadku można wygenerować za pomocą PowerPoint, Visio, a nawet Photoshop. Można to sprawdzić, wyłączając JavaScript w przeglądarce i ponownie ładując stronę.

Rozumiem, że te pojedyncze zdjęcia można wykonać z MMA. Niektóre odpowiedzi pokazują właściwy kierunek, w jaki można to zrobić. Akceptuję więc najlepszą odpowiedź, jaka doszła do tej pory.

+4

Większość elementów można łatwo znaleźć w Mathematica. Możesz mieć 'Strzałki', na przykład oparte na' BezierCurve's lub 'BSplineCurve's. Klikalne nazwy mogą być zaimplementowane jako 'Button' z' Wyglądem -> "Bezramkowym" '. Reszta to po prostu praca. Być może zmienna grubość strzałek na grafice może być trudna do odtworzenia. Może być konieczne powstrzymanie się od używania 'Strzałki' i zbudowanie ich z bardziej podstawowych prymitywów do rysowania. Co spróbowałeś, zanim zadałeś to pytanie? –

+0

@ SjoerdC.deVries Nie próbowałem dotąd. Właśnie przeczytałem wiadomości w BBC i pomyślałem, że to będzie dobry problem dla lekcji praktyki MMA. Spróbuję to zrobić, ale chcę, żeby inni też się przyjrzeli. Zwłaszcza te minizje nudzące się w mglisty sobotni poranek. – PlatoManiac

+1

Myślę, że chociaż wymaga to dużo pracy, nie jest to zbyt trudne zadanie. Będziesz musiał owijać obiekty graficzne w 'EventHandler', robić kliknięcia, modyfikować niektóre zmienne i umieszczać całą' Grafikę' w 'Dynamic', aby była aktualizowana po zmianie tych zmiennych. 'HighlightGraph' jest dobre dla uproszczonego rozwiązania.Wykonaj ukierunkowany wykres 'g', a następnie wykonaj' SetterBar [Dynamiczny [kolor], {Czerwony, Zielony, Niebieski}] ', Dynamic @ HighlightGraph [g, {Styl [1 \ [DirectedEdge] 2, kolor]}]' – Szabolcs

Odpowiedz

3

Kolejna rozrusznik:

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

Edit Bardziej kompaktowy:

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

(Chciałem przez chwilę narysować schematy ...) Rzecz w tym, że OP nie wspomina, że ​​szerokości zakrzywionych strzałek powinny być proporcjonalne do przepływów, które reprezentują. Bardziej rozbudowane diagramy tego typu mają zakrzywione strzałki biegnące "w obie strony" - pokazujące wielkość przepływów zi do wszystkich możliwych źródeł. IMO, nie ma srebrnej kuli w Mathematica ... Byłoby znacznie łatwiej podjąć próbę, jeśli można, na przykład, określić Linię [], która zmieniałaby szerokość w zależności od wielkości We/Wy, które prawdopodobnie różnią się na obu końcach bardziej złożonych przykładów. – telefunkenvf14

+1

@tele Uświadomiłem sobie rzecz o zmiennej szerokości strzałki, ale także wiele innych mniejszych i większych szczegółów na wykresie OP. Może wymagać wiele czasu, aby zająć się nimi wszystkimi, a poza tym jest to dość nudne. Ale ... myślę, że masz tu fajne pytanie ... coś w rodzaju: "Jak zrobić strzałkę o sparametryzowanej szerokości wzdłuż łuku?" –

+1

Mam wiele pytań, które chciałbym zadać, ale uważam za bardzo nudne, aby upewnić się, że dokładnie wyjaśniam, co dokładnie próbuję zrobić. Problemy z projektowaniem i integracją są zawsze w mojej głowie, co jest bardzo ważne, aby wcisnąć się w jedno pytanie i wydaje się, że przesuwa granice tego, co jest przeznaczone. Chciałbym, aby zorganizowany sposób (dla użytkowników MMA) koordynował rozwiązywanie niektórych z tych "dużych" problemów i wspólnie pracował nad sprawami open source. IMO, WRI naprawdę musiałby być zaangażowany w jakiś sposób. Czuję się sfrustrowana przez murowaną wiedzę, niedostępną dla nas na zewnątrz. – telefunkenvf14

3

To nie jest pełna odpowiedź, ale jest zbyt długi na komentarz. Zachęcam wszystkich do „kradzieży” od niego, a zakończyć go :-)

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

Następnym krokiem jest użycie VertexShapeFunction z obiektów zawinięte w EventHandler zastąpić SetterBar.

+1

Nie podoba mi się chwiejność strzałek w grafice graficznej –

+0

@Sjoerd To też można spersonalizować, a 'GraphPlot' ma inną wartość domyślną. W każdym razie był to tylko punkt wyjścia, nie zamierzony jako coś zbliżonego do ostatecznego rozwiązania. Może ten nie będzie nawet używał wykresów. Opublikowalem tylko, aby ułatwić innym rozpoczęcie pracy (jeśli ktoś chce tego użyć). – Szabolcs

+0

@ SjoerdC.deVries Dzięki za edycję. – Szabolcs

4

Niektóre bardziej podstawowe nóg na to:

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

Ładne cienie! Gratulacje z pierwszym 1000 pkt. BTW –

+0

Dzięki. Zastanawiam się, czy wszystkie prymitywy nie powinny mieć więcej dyrektyw renderujących takich jak ten ({AbsoluteShadow [n], Arrow [pts]} –

+0

To jest również o wiele ładniejszy cień niż ten, który ma obecnie 'PlotLegends', ale może lepiej nie dodawać to jak jest już powolne, jak jest teraz (zobacz http://stackoverflow.com/questions/8189742/plotlegends-makes-manipulate-ing-graphs-slow-to-a-crawl/8189802#8189802). –

Powiązane problemy