Wolfram mathematica Mathematica帮助中的ColorFunctionScaling示例失败-为什么?
这本书中有一个例子 当我自己在Mathematica 7上对其进行评估时,两个输出图看起来都像左边的图 但是,如果我对此进行评估,我会得到右侧的绘图,如上图所示:Wolfram mathematica Mathematica帮助中的ColorFunctionScaling示例失败-为什么?,wolfram-mathematica,plot,Wolfram Mathematica,Plot,这本书中有一个例子 当我自己在Mathematica 7上对其进行评估时,两个输出图看起来都像左边的图 但是,如果我对此进行评估,我会得到右侧的绘图,如上图所示: Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, ColorFunction -> Function[{x, y}, Hue[x]], ColorFunctionScaling -> True] 为什么给出的例子会失败 Alexey和Simon证明了这
Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick,
ColorFunction -> Function[{x, y}, Hue[x]],
ColorFunctionScaling -> True]
为什么给出的例子会失败
Alexey和Simon证明了这不是HoldAll的结果,正如我之前推测的那样
这个例子的存在让我怀疑它曾经起作用,而它在版本8上起作用的信息告诉我行为已经改变了。究竟发生了什么变化?评估顺序似乎有点混乱。如果在查看
绘图
命令之前强制替换中的cf
,则该命令有效。为此,我们使用和[{x=x},…]
构造:
Table[With[{cf = cf},
Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick,
ColorFunction -> Function[{x, y}, Hue[x]],
ColorFunctionScaling -> cf]], {cf, {False, True}}]
奇怪的是,在Mathematica版本8中,你不需要这样的混乱
更奇怪的是,Mathematica 7文档中有一个示例,其中预评估的图形与该版本生成的图形不匹配。(顺便说一句,你的问题很有趣。文档中广泛使用了上述向内置函数提供选项值的方法。它只在
ColorFunctionScaling
中失败这一事实看起来像是一个bug。在v.8中不存在这个问题的信息证实了这是v.7中的一个bug
无论如何,请考虑以下内容:
In[1]:= SetAttributes[f, HoldAll]
f[__, OptionsPattern[ColorFunctionScaling -> False]] :=
OptionValue[ColorFunctionScaling]
Table[f[Sin[4 Pi x], {x, 0, 1/2},
ColorFunctionScaling -> cf], {cf, {False, True}}]
Out[3]= {False, True}
您可以看到中的HoldAll
属性实际上并不阻止替换cf
通过这种方式,非常有趣的是,v.7中Plot
和Table
中所描述的错误行为的原因是什么?这个错误实际上与HoldAll属性有关,但我被愚弄了,以为不是。通过执行以下命令可以看到这一点:
Plot[Sin[x], {x, 0, Pi}];
Unprotect[Plot]
ClearAttributes[Plot, HoldAll]
Table[Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick,
ColorFunction -> Function[{x, y}, Hue[x]],
ColorFunctionScaling -> cf], {cf, {False, True}}]
需要第一个绘图
,以激活包裹装载
因此,可以通过在Evaluate
中包装ColorFunctionScaling->…
来获得正确的行为:
Table[Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick,
ColorFunction -> Function[{x, y}, Hue[x]],
Evaluate[ColorFunctionScaling -> cf]], {cf, {False, True}}]
比我快!我怀疑这是一个带有
cf
内部Plot
/Table
变量本地化的bug,正如您所指出的,显然是在8.0中修复的。这还有什么影响?我认为Table
是一个有效的作用域构造,这种情况不会发生。@Mr.Wizard:Table
使用Block
-就像作用域一样,Plot
是HoldAll
,所以如果Plot
不计算值,它就不会解析为它的值。@Brett现在我明白了。我应该意识到这一点,我很惊讶我以前没有遇到过这样的问题。我甚至没有检查这一点,因为我确信期权价值已经评估过了。我责备自己不知道这一点,但我安慰自己,我不是第一个(re:help file)。@Brett@Mr.Wizard:我不确定这是否那么简单。其他绘图选项很乐意放入表中,例如table[Plot[Sin[4 Pi x],{x,0,1/2},PlotStyle->{tt}],{tt,{nonesense,Thin,Thin}}]
。或者对{Hue,grayelevel}
上的ColorFunction
执行相同的操作……由于这种行为在当前的v8中没有出现,我更改了链接以指向遗留的v7文档。(我希望没问题!)西蒙谢谢,这样更好。亚历克赛,我错过了这个回复。让我想想+1@Mr.WizardHoldAll
确实阻止了替换。您观察到的是由于表所使用的类似块的(动态)作用域机制,加上选项值
中使用的魔力,它使用cf
的运行时值。您可以使用Trace
查看OptionValue
扩展为OptionValue[ColorFunctionScaling->False,{ColorFunctionScaling->cf},ColorFunctionScaling]
,然后正是在该评估中替换cf
的值。旧的OptionQ
基于选项检查的方式更直接、更容易理解,并且不涉及任何魔法。@Leonid我直到现在才看到这一点(我相信只有第一个@person得到通知)。请您将此作为一个更详细的答案发表好吗?@Mr.Wizard我不想将此作为一个答案发表,因为我的评论与所问的问题无关,而是对@Alexey的观察的评论。而且,我不知道如何更好地解释它@Alexey注意到f
的HoldAll
并没有阻止cf
被其值替代,我注意到,替代不是在评估f[args]
时(l.h.s),而是在评估f
定义的r.h.s上的OptionValue
时发生的。因此,我的观点是,这是OptionValue
评估的结果,与f
的HoldAll
属性无关。有趣的是,加载了哪个包以及加载包的机制是什么<代码>定义[绘图]
没有给出答案。@Alexey,你看到了吗?第一次使用Plot加载一些重置其属性的.mx文件,因此如果您在新内核中尝试上面的代码,而不使用第一行Plot
,Plot
在创建绘图时再次具有属性HoldAll
。我这样做了,在这种情况下,可以通过查看LogLinearPlot
的定义找到机制:取消保护[LogLinearPlot];ClearAttributes[LogLinearPlot,ReadProtected];定义[LogLinearPlot]
解释了发生的情况。在绘图的情况下
不起作用。
Table[Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick,
ColorFunction -> Function[{x, y}, Hue[x]],
Evaluate[ColorFunctionScaling -> cf]], {cf, {False, True}}]