调整Mathematica中现有Graphics对象的样式/属性

时间:2011-04-13 05:28:38

标签: wolfram-mathematica

Mathematica的优势之一是它对象的一致底层表示。因此,要更改绘图的属性而不重做用于生成它的计算,我可以执行类似

的操作
Replace[myplot, {Graphics[x_List, y_List] :> 
 Graphics[x,Flatten[{y, 
  BaseStyle -> {FontFamily -> Helvetica, FontSize -> 20}}]]}]

不幸的是,每次我想使用这种方法修改绘图以改变线条,点,字体等的样式/颜色时,我必须通过反复试验找出适当的替换规则是什么,这可以抵消因不必重新计算绘制数据而获得的任何效率。这是另一个例子:

myplot = Plot[{Cos[x], Sin[x]}, {x, 0, 2 Pi}, 
  PlotStyle -> {{Red, Dashing[None]}, {Green, Dashing[None]}}]

myplot /. { {x___, PatternSequence[Red, Dashing[_]], y___}
              -> {x, Green, Thickness[.02], Dashing[Tiny], y},
            {x___, Green, y___}
              -> {x, Thickness[Large], Red, y} }

这可以完成工作(改变线条颜色/划线/厚度),但似乎是伏都教。

是否有任何文档(指南或教程) - 缺少对图形对象和基元的确切规范的研究 - 这可以指导我构建适当的替换?如果没有,是否有更好的方法来调整没有重新计算的图的外观(除了在变量中保存数据和使用ListPlot之外)?

2 个答案:

答案 0 :(得分:9)

我在等待你想要的操作的更多例子,但是现在我会指出,有可能在没有替换的情况下做一类这些操作。被迫仅仅猜测你想要什么,一个解释如下。

myplot = Plot[{Sin[x], Csc[x]}, {x, 1, 10}];

Replace[myplot, {Graphics[x_List, y_List] :> 
   Graphics[x, 
    Flatten[{y, 
      BaseStyle -> {FontFamily -> "Helvetica", FontSize -> 20}}]]}]

Show[myplot, BaseStyle -> {FontFamily -> "Helvetica", FontSize -> 20}]

如您所见,在这种情况下,不需要Replace


解决更新后的问题,Plot输出中有两种不同类型的图形对象。

  1. 函数的绘制线(Sin[x]Cos[x])及其样式被“硬编码”到Line个对象中,Graphics可以理解。

  2. Axes -> TruePlotLabel -> "Sine Cosecant Plot"AxesStyle -> Orange等辅助设置直接由Graphics理解,无需转换,因此保留在myplot内对象

  3. 第二种设置可以在事后轻松更改,因为它们是软设置。

    第一种以某种方式处理。由于不同的*Plot函数输出GraphicsPlot的不同模式本身可能会根据给定的输入给出不同的输出模式,这很复杂。

    我不知道有任何全局方法可以重新设置所有绘图类型,如果经常进行重新设置,那么保留所需数据并简单地使用Plot重新生成图形可能更有意义。然而,对于基本用途,您的方法可以改进。绘制的每个函数按给定顺序创建Line对象。因此,你可以使用这样的东西来完全重绘一个情节:

    myplot = Plot[{Cos[x], Sin[x]}, {x, 0, 2 Pi}, 
      PlotStyle -> {{Red, Dashing[None]}, {Green, Dashing[None]}}]
    
    newstyles = Directive @@@
       {{Green, Thickness[.02], Dashing[Tiny]},
        {Thickness[Large], Red}};
    
    i = 1;
    MapAt[# /. {__, l : Line[__]} :> {newstyles[[i++]], l} &, myplot, {1, 1}]

    enter image description here

    请注意上面代码最后一行的粗体字部分。这是Linemyplot个对象位置的部件规范,可能会发生变化。通常这将按原样运行,但如果您发现必须经常更改它,则应该可以使用检测其位置的函数(如果需要,请询问)。


    图形检查器

    telefunkenvf14的评论提醒我,我没有提到图形检查员。

    虽然我个人倾向于避免广泛的后续重绘,因为我喜欢将所有内容保存在一个地方(Plot命令),而我更喜欢对代码进行哪些更改,以便有记录我的设置而无需深入了解Graphics对象,图形检查器可直接应用。

    • 双击图表。边框应从橙色变为灰色。
    • 单击其中一个绘图线。 (当您将鼠标悬停在元素上时,指针应该会改变)
    • Ctrl + g 打开图形检查器。
    • 进行所需的更改,然后关闭图形检查器。

    您现在可以复制并粘贴整个图形,或直接将其指定给符号:p = <graphic>

    另请参阅:http://www.wolfram.com/broadcast/screencasts/howtoeditmathematicagraphics/

答案 1 :(得分:1)

我有时会发现替换整个规则/选项很有用,而不仅仅是规则的RHS。例如,基于您的示例,这样的事情:

myplot /. (PlotStyle -> x__) -> (PlotStyle -> myRestyle[x]);

我也喜欢这样可以避免附加选项重复的问题。

这对重新设置其他对象非常方便,例如:

styledText /. (FontSize->x_) -> (FontSize->2x)