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} }

这样就完成了工作(更改线的颜色/虚线/厚度),但似乎是巫毒的。

是否有任何文档(指南或教程)-仅仔细研究Graphics对象和基元的确切规范-可以指导我构造适当的替代品?。如果没有,是否有更好的方法来调整图的外观无需重新计算(除了将数据保存在变量中并使用ListPlot之外)?

最佳答案

我等待着您期望的操作的更多示例,但是现在我要指出的是,有可能完全不用替换就可以进行其中的一类操作。被迫仅仅猜测您想要什么,下面是一种解释。

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输出中有两种不同类别的图形对象。
  • 将函数(Sin[x]Cos[x])及其样式绘制的线“硬编码”为Line对象,Graphics可以理解。
  • 辅助设置(例如Axes -> TruePlotLabel -> "Sine Cosecant Plot"AxesStyle -> Orange)可直接由Graphics理解,无需进行转换,因此保留在myplot对象中。

  • 事实上,第二种设置很容易更改,因为它们是软设置。

    第一种可以通过某种方式进行处理。由于不同的*Plot函数输出不同的Graphics模式,而Plot本身可能根据给定的输入给出不同的输出模式,这使情况变得复杂。

    我不知道有任何全局方式可以重新设置所有绘图类型的样式,如果您经常进行这种样式调整,则保留所需数据并仅使用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}]

    请注意上面代码最后一行中的粗体部分。这是Line对象在myplot中的位置的零件规范,并且可能会更改。通常这可以照常工作,但是如果您发现必须经常更改它,则应该可以使用一个功能来检测其位置(如果需要,可以询问)。

    图形检查器

    telefunkenvf14的评论提醒我,我疏忽不提Graphics Inspector。

    虽然我个人倾向于避免大量的事后重绘样式,因为我喜欢将所有内容都放在一个位置(Plot命令),并且我更喜欢对代码进行更改,因此无需更改就可以记录我的设置要深入研究Graphics对象,可直接应用Graphics Inspector。
  • 双击图。边框应从橙色更改为深灰色。
  • 单击绘图线之一。 (当您将鼠标悬停在元素上时,指向的应该改变)
  • 按Ctrl + g打开图形检查器。
  • 进行所需的更改,然后关闭图形检查器。

  • 现在,您可以复制并粘贴整个图形,或直接将其分配给符号:p = <graphic>
    另请参见:http://www.wolfram.com/broadcast/screencasts/howtoeditmathematicagraphics/

    关于wolfram-mathematica - 在Mathematica中调整现有Graphics对象的样式/属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5644801/

    10-13 08:45