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}}]
当我在 Mathematica 7 上自行评估时,两个输出图看起来都像左边的。
但是,如果我对此进行评估,我会在右侧上得到图,如上所示:
Plot[Sin[4 Pi x], {x, 0, 1/2}, PlotStyle -> Thick,
ColorFunction -> Function[{x, y}, Hue[x]],
ColorFunctionScaling -> True]
为什么给定的示例失败?
阿列克谢和西蒙证明这不是HoldAll的结果,正如我之前所说的那样。
该示例的存在使我怀疑它曾经有效,并且它在版本8上工作的信息告诉我行为已经改变。究竟发生了什么变化?
答案 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版中Plot
与Table
描述错误行为的原因真的很有意义?
答案 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}}]
奇怪的是,您在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}}]