Wolfram mathematica Mathematica帮助中的ColorFunctionScaling示例失败-为什么?

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证明了这

这本书中有一个例子

当我自己在Mathematica 7上对其进行评估时,两个输出图看起来都像左边的图

但是,如果我对此进行评估,我会得到右侧的绘图,如上图所示:

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.Wizard
HoldAll
确实阻止了替换。您观察到的是由于
表所使用的类似
块的(动态)作用域机制,加上
选项值
中使用的魔力,它使用
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}}]