Re: Just primitive ColorFunction
- To: mathgroup at smc.vnet.net
- Subject: [mg87521] Re: Just primitive ColorFunction
- From: ucervan at gmail.com
- Date: Sat, 12 Apr 2008 06:57:58 -0400 (EDT)
- References: <ftfej7$bu7$1@smc.vnet.net> <ftfk8g$fab$1@smc.vnet.net>
> 1. Is there a more appropriate way to force Plot to calculate the > function value at certain points? How about (not very clean, but does the work if you really need to use ColorFunction for this to make it work with Filling): ep = 0.0001; Plot[Sin[x], {x, 0, 4 Pi}, PlotStyle -> Thick, ColorFunction -> (If[Sin[#] >= 0, RGBColor[1, 0, 0], RGBColor[0, 0, 1]] &), ColorFunctionScaling -> False, Mesh -> {{Pi, Pi + ep, 2 Pi, 2 Pi + ep, 3 Pi, 3 Pi + ep}}, MeshStyle -> None] and if you still need to add mesh points in the x direction, use: ep = 0.0001; Plot[Sin[x], {x, 0, 4 Pi}, PlotStyle -> Thick, ColorFunction -> (If[Sin[#] >= 0, RGBColor[1, 0, 0], RGBColor[0, 0, 1]] &), ColorFunctionScaling -> False, Mesh -> {{Pi, Pi + ep, 2 Pi, 2 Pi + ep, 3 Pi, 3 Pi + ep}, 10}, MeshStyle -> {None, Black}, MeshFunctions -> {#1 &, #1 &}] > > 2. Is there a way to avoid having to find the zeros of the function > manually? (More generally: avoid having to calculate the points where > the colouring changes abruptly.) Look at these two cases: 1) Plot[x, {x, 0, 4 Pi}, PlotStyle -> Thick, ColorFunction -> (If[Mod[IntegerPart[30 #], 2] == 0, RGBColor[1, 0, 0], RGBColor[0, 0, 1]] &)] 2) Plot[x, {x, 0, 4 Pi}, PlotStyle -> Thick, Mesh -> 20, MeshShading -> {Red, Blue}] Subdividing 1) by color will succeed only if the initial sampling gets the colored regions right. Then a color based "find root" will need to be computed for every single "color jump". We will also need to define what a "jump" or color based Exclusion is. 2) is the way of dealing with subdividing curves and surfaces via the Mesh/MeshFunctions/MeshShading options. An Automatic intersection method can be attained in many cases (only if the mesh functions evaluate to +/- values, so no min/max tangential intersections) with something like: Plot[Sin[x], {x, 0, 4 Pi}, PlotStyle -> Thick, Mesh -> {{0.}}, MeshShading -> {Red, Blue}, MeshFunctions -> {(Sin[#]) &}] Plot[{x, Sin[x] + x}, {x, 0, 4 Pi}, PlotStyle -> Thick, Mesh -> {{0.}}, MeshShading -> {Red, Blue}, MeshFunctions -> {(Sin[#]) &}] Plot[{Cos[x] + x, Sin[x] + x}, {x, 0, 4 Pi}, PlotStyle -> Thick, Mesh -> {{0.}}, MeshShading -> {Red, Blue}, MeshFunctions -> {(Sin[#] - Cos[#]) &}] Finally, using all ColorFunction/Mesh/MeshFunctions/Filling options together: Plot[{x, Sin[x] + x}, {x, 0, 4 Pi}, PlotStyle -> Thick, Mesh -> {{0.}}, MeshFunctions -> {(Sin[#]) &}, ColorFunction -> (If[Sin[#] >= 0, RGBColor[1, 0, 0], RGBColor[0, 0, 1]] &), ColorFunctionScaling -> False, Filling -> {1 -> {2}}] -Ulises Cervantes WRI