Graphics mathematica如何实现这种动态绘图?

Graphics mathematica如何实现这种动态绘图?,graphics,wolfram-mathematica,Graphics,Wolfram Mathematica,这里是BBC动态。我想用Mathematica重现这些图形是可能的 在回答的过程中,我们将看到MMA中提供的一些迷人的图形技巧。这是在这里提出这个问题的唯一原因 更新: 我刚刚检查了BBC是否正在使用简单的JavaScript来做这件事。他们手动制作静态图片,甚至不使用基于Flash的事件处理。所以所有的图片都是静态实体,一旦我们点击一个国家,它就会生成一个独特的图像。对于其他国家,它显示其他图像。每个案例的单独图像可以通过PowerPoint、Visio甚至Photoshop生成。您可以通过

这里是BBC动态。我想用Mathematica重现这些图形是可能的

在回答的过程中,我们将看到MMA中提供的一些迷人的图形技巧。这是在这里提出这个问题的唯一原因

更新:

我刚刚检查了BBC是否正在使用简单的JavaScript来做这件事。他们手动制作静态图片,甚至不使用基于Flash的事件处理。所以所有的图片都是静态实体,一旦我们点击一个国家,它就会生成一个独特的图像。对于其他国家,它显示其他图像。每个案例的单独图像可以通过PowerPoint、Visio甚至Photoshop生成。您可以通过在浏览器中禁用JavaScript并重新加载页面来检查这一点


我知道这些单张照片可以用MMA制作。一些答案为我们指明了正确的方向。因此,我接受了迄今为止最好的答案。

这不是一个完整的答案,但太长了,无法发表评论。我鼓励每个人从中“窃取”并完成它:-)

下一步是使用
VertexShapeFunction
和包装在
EventHandler
中的对象来替换
SetterBar

只是另一个启动程序:

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

编辑更紧凑:

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[BSplineCurve@{k, {0, 0}, #}] & /@ b}], k -> i]],
    {i, b}], List -> Button, {2}, Heads -> True]]
 ,
 SectorOrigin -> {Automatic, 1},
 Epilog -> Dynamic@a]

一些更基本的步法:

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[
  Dynamic@If[pick == 1, one, two],
  Function[{point}, If[First[point] < 256, pick = 1, pick = 2]]]
 ]
g[\[Alpha]\uu,\[Beta]\uu,color:=Module[{t},
t=图形[{厚度[.03],箭头[{.15}],颜色,
箭[
贝塞尔曲线[{Cos[\[Alpha]],Sin[\[Alpha]},{0,
0},{Cos[\[Beta]],Sin[\[Beta]]}}]},
绘图范围->1.5,图像大小->512,背景->无];
ImageCompose[模糊[t,15],t]
]
一=折叠[图像合成,
g[0,\[Pi]/3,Blue],{g[0,\[Pi]/2,Blue],g[0,\[Pi],Blue],
g[0,4\[Pi]/3,蓝色]}]
two=折叠[图像合成,
g[\[Pi]/3,0,黄色],{g[\[Pi]/3,\[Pi]/2,黄色],
g[\[Pi]/3,\[Pi],黄色],g[\[Pi]/3,4\[Pi]/3,黄色]}]
动态模块[{pick=1},
单击窗格[
Dynamic@If[pick==1,1,2],
函数[{point},如果[First[point]<256,pick=1,pick=2]]
]

在Mathematica中可以很容易地找到大多数元素。您可以有
箭头
s,例如基于
贝塞尔曲线
s或
BSplineCurve
s。可单击的名称可以实现为具有
外观->无框架
按钮。剩下的只是工作。也许图形中箭头的可变厚度可能很难再现。可能需要避免使用
箭头
,并使用更基本的绘图原语构建它们。在问这个问题之前,你自己试过什么?@SjoerdC.deVries我到目前为止还没有试过。刚才读了BBC的新闻,认为这对MMA练习课来说是个好问题。我会试着去做,但我也希望其他人也来看看。特别是那些在有雾的星期六早上无聊的人。我认为这需要很多工作,但不是一项太难的任务。您需要将图形对象包装在
EventHandler
中,单击修改一些变量,并将整个
图形
放入
动态
中,以便在这些变量更改时更新
HighlightGraph
适用于简化的解决方案。制作一个有向图
g
然后做
SetterBar[Dynamic[color],{Red,Green,Blue}]
Dynamic@HighlightGraph[g,{Style[1\[directedge]2,color]}]
@Plato那里有太多无聊的细节,但我看不到任何真正困难的任务。如果你不知道如何在图形中绘制特定的对象,我们可能会有所帮助,但复制所有小细节需要很多时间。我同意belisarius和szabolcs的观点。有太多的细节无法重现,也不能很好地利用社区的时间。我投票决定以“太本地化”结束我不喜欢图表中箭头的摇摆graphics@Sjoerd也可以自定义,并且
GraphPlot
具有不同的默认值。不管怎么说,这只是一个起点,并不是为了接近最终解决方案。也许那个人甚至不会使用图表。我的帖子只是为了让其他人更容易开始(如果有人希望使用这个)。(我想画这样的图表有一段时间了…)问题是,OP没有真正提到弯曲箭头的宽度应该与它们所代表的流量成比例。这种类型的更精细的图表有“双向”的曲线箭头——显示从所有可能来源流入和流出的流量大小。依我看,数学中没有银弹。。。如果可以,比如说,指定一条线[]来改变宽度,作为输入/输出大小的函数,这将更容易尝试。在更复杂的例子中,这可能在两端都不同。@tele我意识到了可变箭头宽度的事情,但在OP的图表中还有许多其他越来越小的细节。解决这些问题可能需要很多时间,除此之外,这也很无聊。但是我想你有一个很好的问题要发布在这里。。。我有很多问题想问,比如:“如何使箭头沿其弧线具有参数化的宽度?”但我发现要确保正确地解释我要做的事情是非常乏味的。设计和集成问题也一直萦绕在我的脑海中,这是一个很难塞进一个问题的问题,似乎已经超出了设计的目的。我希望有一种有组织的方式(对于MMA用户)来协调解决这些类型的“大”问题,并共同开发开源产品。在国际海事组织,WRI也确实需要参与其中。我对外界无法接触到的封闭知识感到沮丧。这可能是因为我最初认为箭头的宽度会随其路线变化的假设是错误的。这可能是因为它们之间的部分重叠导致它们具有这种外观。很好的阴影!康格拉特
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[
  Dynamic@If[pick == 1, one, two],
  Function[{point}, If[First[point] < 256, pick = 1, pick = 2]]]
 ]