re: Coloring 2DPlot with different colors

*To*: mathgroup at yoda.physics.unc.edu*Subject*: re: Coloring 2DPlot with different colors*From*: Paul=Rubin%Management%Business at banyan.cl.msu.edu*Date*: Mon, 13 Jun 94 11:02:10 EDT

Wang Jian-hua <WANGJH at am.nie.ac.sg> wrote: >Does any one knows how to make on 2DPlot with different colors? For >example, I'd like to use two different color to emphasize decreasing or >increasing of a function or the positive and negative values of a function. >Thanks for help. >Jian-hua There are at least two ways (the not-so-easy way and the not-even-that-easy way). The easier of the two, when you are going to use a small number of distinct colors, is to split the function you want to plot into several functions, each taking values on a different part of the domain. For example, to plot the Sin function with different colors for positive and negative values: In[]:= f1[x_] := Sin[x] /; Sin[x] >= 0 In[]:= f2[x_] := Sin[x] /; Sin[x] < 0 Function f1 fails to reduce to a number if the value of Sin[x] is negative. In[]:= Off[ Plot::plnr ]; In[]:= Plot[ {f1[x], f2[x]}, {x, 0, 6 Pi}, PlotStyle -> {{Hue[ .3 ]}, {Hue[ .7 ]}} ]; In[]:= On[ Plot::plnr ]; For each value of x in Plot, either f1 or f2 fails to yield a number, so no point is plotted for that function. I turned off the warning messages that produces. I used Hue, but RGBColor, CYMKColor or GrayLevel would work just as well. To get closer to continuous coloring takes a lot more work. Here is the Sin function plotted with the Hue at each point equal to the absolute value of the ordinate: In[]:= p = Plot[ Sin[x], {x, 0, 6 Pi}, DisplayFunction -> Identity ]; (* Store the plot in p but don't display it *) In[]:= q = First[ First[ Cases[ p, Line[_], 20 ] ] ]; (* Isolate the argument of the Line[] command in q *) In[]:= q // Short -16 Out[]= {{0., 0.}, <<159>>, {18.8496, -7.34764 10 }} (* q is a list of 161 points *) In[]:= q1 = Partition[ q, 2, 1 ]; (* Partition the point list into a list of line segments *) In[]:= q1 // Short Out[]= {{{0., 0.}, {0.392699, 0.382683}}, <<159>>} (* q1 has 160 pairs of points *) In[]:= q2 = {Hue[ Abs[ #[[1, 2]] ] ], Line[ # ]}& /@ q1; (* Replace each pair of points with a pair of graphics primitives, Hue and Line, where the argument for Hue is the ordinate of the left endpoint of the line segment *) In[]:= q2 // Short Out[]= {{Hue[0.], Line[{{0., 0.}, <<1>>}]}, <<159>>} In[]:= p1 = p /. {Line[_]} -> q2; (* Replace the line in the original plot with this list *) In[]:= Show[ p1, DisplayFunction -> $DisplayFunction ] (* Display the result *) ************************************************************************** * Paul A. Rubin Phone: (517) 336-3509 * * Department of Management Fax: (517) 336-1111 * * Eli Broad Graduate School of Management Net: RUBIN at MSU.EDU * * Michigan State University * * East Lansing, MI 48824-1122 (USA) * ************************************************************************** Mathematicians are like Frenchmen: whenever you say something to them, they translate it into their own language, and at once it is something entirely different. J. W. v. GOETHE