19
$\begingroup$

Bug introduced in V8.0 or earlier and persisting through V12.1.0 or later. Fixed in V13.0.0 or earlier


f[x_?NumericQ]:= (Do[Break[],{i,1,2}];x)
Plot[x,{x,0,1},ColorFunction->(ColorData["Rainbow"][f[#]]&)]

Break::nofwd: No enclosing For, While, or Do found for Break[].

What's going on here? I've tried setting HoldFirst attribute on f and I've also tried using Unevaluated which gives surprising results:

(* Works fine, gives plot colored as expected *)
Plot[x, {x, 0, 1}, 
 ColorFunction -> (Unevaluated[ColorData["Rainbow"][f[#1]]] &)]

(* Gives a black and white plot with error:
   "Unevaluated is not a Graphics primitive or directive" *)
ListContourPlot[IdentityMatrix[3],
  ColorFunction->(Unevaluated[ColorData["Rainbow"][f[#1]]]&)]

Edit This on the other hand works:

Plot[x,{x,0,1},ColorFunction->Function[c,ColorData["Rainbow"][f[c]]]]

Which only difference is that it uses Function[c,ColorData["Rainbow"][f[c]]]] instead of Function[ColorData["Rainbow"][f[Slot[1]]]]]

$\endgroup$
9
  • $\begingroup$ @NasserM.Abbasi if you don't like getting into the internals I think you chose the wrong question. I think this behaviour is quiiite weird $\endgroup$
    – Rojo
    Commented Dec 17, 2012 at 20:34
  • $\begingroup$ I have no idea what's going on. It seems like Return and Break just don't work properly when running a ColorFunction. The Unevaluated might fix it because the ColorFunction doesn't actually evaluate the Break statement while inside the function $\endgroup$
    – Rojo
    Commented Dec 17, 2012 at 20:43
  • 1
    $\begingroup$ Perhaps, ColorFunction does some checking on the structure of the option (see that it can receive a string, a number, a function, and treat those cases differently). And, for some reason, when it's a function, Break and Return die. However, not when it's a function in the form Function[Null, ...]. Nonsense $\endgroup$
    – Rojo
    Commented Dec 17, 2012 at 20:46
  • $\begingroup$ Another interesting observation is that Plot[x, {x, 0, 1}, ColorFunction -> Composition[ColorData["Rainbow"], f]] does not give an error, but it does not colour the plot either. The simpler Plot[x, {x, 0, 1}, ColorFunction -> Composition[ColorData["Rainbow"], # &]] doesn't work either. However, if I wrap it like this, Composition[ColorData["Rainbow"], # &], then use ColorFunction -> z, it does work. $\endgroup$
    – Szabolcs
    Commented Dec 17, 2012 at 20:52
  • 4
    $\begingroup$ If I am not mistaken, this behavior is a consequence of a bad interaction of Break with AbortProtect, which in turn is probably used in some Plot code. It's an area that is receiving some attention in recent development work. I'm not sure what is the prognosis though. $\endgroup$ Commented Oct 16, 2016 at 15:54

1 Answer 1

1
$\begingroup$

Fixed in V13.0.0

$Version
13.0.0 for Mac OS X ARM (64-bit)
f[x_?NumericQ] := (Do[Break[], {i, 1, 2}]; x)
Plot[x, {x, 0, 1}, ColorFunction -> (ColorData["Rainbow"][f[#]] &)]

plotbug


screenshot

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.