Leo*_*yev 5 wolfram-mathematica
Mathematica的优势之一是它对象的一致底层表示.因此,要改变绘图的属性而不重做用于生成它的计算,我可以做类似的事情
Replace[myplot, {Graphics[x_List, y_List] :>
Graphics[x,Flatten[{y,
BaseStyle -> {FontFamily -> Helvetica, FontSize -> 20}}]]}]
Run Code Online (Sandbox Code Playgroud)
不幸的是,每次我想使用这种方法修改绘图以改变线条,点,字体等的样式/颜色时,我必须通过反复试验找出适当的替换规则是什么,否定任何通过不必重新计算绘制的数据而获得的效率.这是另一个例子:
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} }
Run Code Online (Sandbox Code Playgroud)
这可以完成工作(改变线条颜色/划线/厚度),但似乎是伏都教.
是否有任何文档(指南或教程) - 缺少对图形对象和基元的确切规范的研究 - 这可以指导我构建适当的替换?如果没有,是否有更好的方法来调整图的外观没有重新计算(除了在变量中保存数据和使用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}]
Run Code Online (Sandbox Code Playgroud)
如您所见,在这种情况下Replace不需要.
解决更新后的问题,输出中有两种不同类型的图形对象Plot.
函数(Sin[x],Cos[x])及其样式的绘制线被"硬编码"成Line对象,这Graphics可以理解.
辅助设置,如Axes -> True,PlotLabel -> "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}};
Run Code Online (Sandbox Code Playgroud)
i = 1;
MapAt[# /. {__, l : Line[__]} :> {newstyles[[i++]], l} &, myplot, {1, 1}]

请注意上面代码的最后一行中的粗体斜体部分.这是Line对象内部位置的部件规范,myplot可能会发生变化.通常这将按原样工作,但如果您发现必须经常更改它,则应该可以检测其位置的功能(如果需要,请询问).
telefunkenvf14的评论提醒我,我疏忽不提图形检查员.
虽然我个人倾向于避免广泛的后续重绘,因为我喜欢将所有内容保存在一个地方(Plot命令),我更喜欢对代码进行哪些更改,以便有一个我的设置记录,而不必深入了解Graphics对象,Graphics Inspector可直接应用.
您现在可以复制并粘贴整个图形,或直接将其分配给符号: p = <graphic>
另见 http://www.wolfram.com/broadcast/screencasts/howtoeditmathematicagraphics/
| 归档时间: |
|
| 查看次数: |
1605 次 |
| 最近记录: |