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

时间:2011-03-23 07:05:27

标签: wolfram-mathematica plot

Mathematica 7 help for Plot > Options > ColorFunctionScaling中有一个例子。

Table[Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, 
  ColorFunction -> Function[{x, y}, Hue[x]], 
  ColorFunctionScaling -> cf], {cf, {False, True}}]

enter image description here

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

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

Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, 
 ColorFunction -> Function[{x, y}, Hue[x]], 
 ColorFunctionScaling -> True]

为什么给定的示例失败?


阿列克谢和西蒙证明这不是HoldAll的结果,正如我之前所说的那样。

该示例的存在使我怀疑它曾经有效,并且它在版本8上工作的信息告诉我行为已经改变。究竟发生了什么变化?

3 个答案:

答案 0 :(得分:2)

你的问题非常有趣。上面提到的向内置函数提供选项值的方法在文档中广泛使用。它仅为ColorFunctionScaling失败的事实看起来像一个错误。并且在第8节中不存在此问题的信息证实这是第7节中的错误。

以任何方式考虑以下事项:

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

通过这种方式,在第7版中PlotTable描述错误行为的原因真的很有意义?

答案 1 :(得分:1)

评估顺序似乎略有不足。如果在查看cf命令之前强制Plot被替换,它就有效。为此,我们使用With[{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}}]

plot

奇怪的是,您在Mathematica版本8中不需要这样的kludge。

Mathematica 7文档中有一个示例,其中预先评估的图形与该版本生成的图形不匹配,这一点更为奇怪。 (很好找,顺便说一下)

答案 2 :(得分:1)

这个错误实际上 与HoldAll属性相关,但我被this auto-load issue欺骗,认为它不是。执行此操作可以看出:

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

激活程序包加载需要第一个Plot

通过将ColorFunctionScaling -> ...包裹在Evaluate

,可以获得正确的行为
Table[Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick, 
  ColorFunction -> Function[{x, y}, Hue[x]], 
  Evaluate[ColorFunctionScaling -> cf]], {cf, {False, True}}]

enter image description here