O volbách ColorFunction a Mesh, 
včetně použití při kreslení grafů, křivek a ploch

Antonín Slavík, MFF UK
slavik@karlin.mff.cuni.cz

ColorFunction

Obarvovací funkce

Definice pomocné funkce pro testování obarvovacích funkcí:

testColors[f_,min_:0,max_:1,dx_:0.005]:=Graphics[Table[{f[i],Rectangle[{i,0},{i+dx,1}]},{i,min,max,dx}],Axes->{True,False},ImageSize->600,AspectRatio->1/6]

Hue vrací barevné odstíny, je periodická s periodou 1.

testColors[Hue,0,3]

Funkce, která na intervalu [0,1] přechází od modré k červené:

blueToRed[t_]:=Hue[0.5+0.5*t]

testColors[blueToRed]

Další obarvovací funkce jsou přístupné pomocí ColorData (všechny jsou definovány na [0,1]):

ColorData["Gradients"]

testColors[ColorData["SunsetColors"]]

Manipulate[testColors[ColorData[col]],{col,ColorData["Gradients"]}]

Barvení grafů, křivek a ploch

Grafy, křivky a plochy lze barvit pomocí libovolné obarvovací funkce. Použijeme volbu ColorFunction s funkcí, která specifikuje barvu bodu v daném místě nebo čase.

Plot[Abs[Sin[x]],{x,0,2π},PlotStyle->Thick,ColorFunction -> Function[{x,y},Hue[y]], AspectRatio->Automatic, ImageSize->700]

Hodnoty předávané obarvovací funkci jsou při výchozím nastavení lineárně transformovány do intervalu [0,1]; tuto vlastnost lze vypnout pomocí ColorFunctionScaling->False.

Plot3D[x+y,{x,0,2},{y,0,2},ColorFunction->Function[{x,y,z},Hue[z]], AxesLabel->{"x","y","z"}]

Plot3D[x+y,{x,0,2},{y,0,2},ColorFunction->Function[{x,y,z},Hue[z]], ColorFunctionScaling->False, AxesLabel->{"x","y","z"}]

c[t_]:={Cos[t]+0.2 Cos[26 t]+0.4 Cos[28 t]+0.8Sin[10 t]-0.4 Sin[17 t]-0.2 Sin[37 t],-0.8 Cos[10 t]-0.4 Cos[17 t]+0.2Cos[37 t]+Sin[t]-0.2 Sin[26 t]+0.4 Sin[28 t]};

ParametricPlot[c[t],{t,0,2Pi}, PlotStyle->Thick]

ParametricPlot[c[t],{t,0,2Pi}, PlotStyle->Thick, ColorFunction->Function[{x,y,t},Hue[t]]]

ParametricPlot[c[t],{t,0,2Pi}, PlotStyle->Thick, ColorFunction->Function[{x,y,t},Hue[x]]]

Použití předdefinovaných barevných schémat (obarvení podle souřadnice z):

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5},ColorFunction->Function[{x,y,z},ColorData["SunsetColors"][z]], BoxRatios->Automatic]

Zkrácený zápis (viz dokumentaci ke ColorFunction).

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5},ColorFunction->"SunsetColors", BoxRatios->Automatic]

ContourPlot[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5},ColorFunction->ColorData["Temperature"]]

Obarvení parametrizované křivky podle rychlosti

Příklad k ilustraci Keplerových pohybových zákonů:

soln=X[t]/.First@NDSolve[{X''[t]==-((X[t])/((Norm[X[t]])^3)),X[0]=={0.5,0},X'[0]=={0,(Sqrt[(1.5/0.5)])}},X[t],{t,0,2 π}]

ParametricPlot[soln,{t,0,2 π}, PlotStyle->Thick]

speed[t_]=Norm[D[soln,t]]

Plot[speed[t],{t,0,2Pi}, PlotStyle->Thick]

max=Maximize[{speed[t],0≤t≤2Pi},t]//First

min=Minimize[{speed[t],0≤t≤2Pi},t]//First

normalizedSpeed[t_]=(speed[t]-min)/(max-min);

Plot[normalizedSpeed[t],{t,0,2Pi}, PlotStyle->Thick]

ParametricPlot[soln,{t,0,2 π}, PlotStyle->Thick, ColorFunction->Function[{x,y,t},blueToRed[normalizedSpeed[t]]], ColorFunctionScaling->False]

Mesh

Použití Mesh v 3D grafice

ParametricPlot3D[{(4+v Cos[(u/2)]) Cos[u],(4+v Cos[(u/2)]) Sin[u],v Sin[(u/2)]},{u,0,2 π},{v,-1,1},Boxed->False]

ParametricPlot3D[{(4+v Cos[(u/2)]) Cos[u],(4+v Cos[(u/2)]) Sin[u],v Sin[(u/2)]},{u,0,2 π},{v,-1,1},Boxed->False, Mesh->None]

ParametricPlot3D[{(4+v Cos[(u/2)]) Cos[u],(4+v Cos[(u/2)]) Sin[u],v Sin[(u/2)]},{u,0,2 π},{v,-1,1},Boxed->False, Mesh->{60,2}]

ParametricPlot3D[{(4+v Cos[(u/2)]) Cos[u],(4+v Cos[(u/2)]) Sin[u],v Sin[(u/2)]},{u,0,2 π},{v,-1,1},Boxed->False, Mesh->{60,2}, MeshStyle->Thick]

Mesh ve dvourozměrném případě

Plot[Sin[x],{x,0,4Pi},Mesh->True,MeshStyle->PointSize[0.02],PlotStyle->{Thick,Red}]

Mesh v tomto případě vyznačí body grafu, které odpovídají dělení definičního oboru na stejně dlouhé intervaly.

Plot[Sin[x],{x,0,4Pi},Mesh->7,MeshStyle->PointSize[0.02],PlotStyle->{Thick,Red}]

Jinou variantou je přímo uvést x-ové souřadnice bodů, které chceme vyznačit.

Plot[Sin[x],{x,0,4Pi},Mesh->{{1,2,3}},MeshStyle->PointSize[0.02],PlotStyle->{Thick,Red}]

Zajímavějších výsledkům lze dosáhnout spojením Mesh s volbou MeshFunctions. Na grafu pak budou vyznačeny body, ve kterých funkce zadaná v MeshFunctions nabývá hodnot specifikovaných v Mesh.

Výchozí nastavení MeshFunctions pro Plot je Function[{x,y},x]:

Plot[Sin[x],{x,0,4Pi},Mesh->{{1,2,3}},MeshStyle->PointSize[0.02],MeshFunctions->{Function[{x,y},x]},PlotStyle->{Thick,Red}]

Plot[Sin[x],{x,0,4Pi},Mesh->{{-1/2,1/2}},MeshStyle->PointSize[0.02],MeshFunctions->{Function[{x,y},y]},PlotStyle->{Thick,Red}]

Vyznačení všech nulových bodů funkce:

Plot[-12-58 x+(x^2)+(x^3),{x,-10,10},MeshFunctions->{Function[{x,y},y]},Mesh->{{0}},MeshStyle->PointSize[Large], PlotStyle->Thick]

Vyznačení průsečíků dvou funkcí:

f[x_]:=27 x+130; g[x_]:=-12-58 x+(x^2)+(x^3);

Plot[{f[x],g[x]},{x,-10,10},MeshFunctions->{Function[{x,y},f[x]-g[x]]},Mesh->{{0}},MeshStyle->PointSize[Large], PlotStyle->Thick]

Clear[f,g]

Varování:  Algoritmus obvykle nevyznačí body na krajích definičního oboru a body, ve kterých se nabývá lokálních extrémů:

Plot[Sin[x],{x,0,4Pi},Mesh->{{0}},MeshStyle->PointSize[0.02],MeshFunctions->{Function[{x,y},y]},PlotStyle->{Thick,Red}]

Plot[3Cos[x]+x^2,{x,-2.5,2.5},Mesh->{{3}},MeshStyle->PointSize[0.02],MeshFunctions->{Function[{x,y},y]},PlotStyle->{Thick,Red}]

Znázornění vrstevnic na grafu funkce dvou proměnných

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}, BoxRatios->Automatic]

Vyznačení vrstevnic odpovídajících hodnotám 0.25, 0.50, 0.75, ..., 2.75:

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}, BoxRatios->Automatic, MeshFunctions->{Function[{x,y,z},z]},Mesh->{Range[0.25,2.75,0.25]}, MeshStyle->Thick]

Střídání barev vrstevnic:

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}, BoxRatios->Automatic, MeshFunctions->{Function[{x,y,z},z],Function[{x,y,z},z]},Mesh->{Range[0.25,2.75,0.5],Range[0.5,2.5,0.5]}, MeshStyle->{{Thick,Red},{Thick,Green}}]

Volba MeshShading

Plot3D[((y^2)/2)-((x^2)/2)+((x^3)/3),{x,-2,2},{y,-2,2},Boxed->False]

ContourPlot[((y^2)/2)-((x^2)/2)+((x^3)/3),{x,-2,2},{y,-2,2},ContourStyle->Thick,Contours->{-2,-1,-0.5,-0.3,-0.1,0,0.1,0.3,0.5,1,2}, PlotRangePadding->None]

Plot3D[((y^2)/2)-((x^2)/2)+((x^3)/3),{x,-2,2},{y,-2,2},Boxed->False, Mesh->{{-2,-1,-0.5,-0.3,-0.1,0,0.1,0.3,0.5,1,2}}, MeshFunctions->{Function[{x,y,z},z]}, MeshStyle->Thick, PlotPoints->60]

MeshShading je seznam barev, které se použijí v oblastech mezi křivkami určenými Mesh a MeshFunctions:

Plot3D[((y^2)/2)-((x^2)/2)+((x^3)/3),{x,-2,2},{y,-2,2},Boxed->False, Mesh->{{-2,-1,-0.5,-0.3,-0.1,0,0.1,0.3,0.5,1,2}}, MeshFunctions->{Function[{x,y,z},z]}, MeshStyle->Thick, MeshShading->{Darker@Blue,LightBlue}, PlotPoints->60]

MeshShading ve 2D:

Plot[-12-58 x+(x^2)+(x^3),{x,-10,10},MeshFunctions->{Function[{x,y},y]},Mesh->{{0}},MeshStyle->PointSize[Large], PlotStyle->Thick, MeshShading->{Red, Blue}]

Použití Mesh k nalezení kontrolních bodů algoritmu adaptivního vykreslování

Graf funkce je ve skutečnosti lomenou čarou spojující velké množství bodů. Tyto body jsou určovány adaptivním algoritmem (v místech s velkou křivostí jsou přidávány další a další body). Pomocí Mesh->All lze tyto body zobrazit:

Plot[Sin[x],{x,0,4Pi},Mesh->All,MeshStyle->PointSize[0.02],PlotStyle->{Thick,Red}]

Graf stejné funkce při použití 10 bodů (PlotPoints->10) a zákazu zjemňování (MaxRecursion->0):

Plot[Sin[x],{x,0,4Pi},Mesh->All,MeshStyle->PointSize[0.02],PlotStyle->{Thick,Red},PlotPoints->10,MaxRecursion->0]

Totéž funguje např. u funkcí dvou proměnných:

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}, BoxRatios->Automatic]

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}, Mesh->All, BoxRatios->Automatic]

Plot3D[((x^2)+3 (y^2)) (E^(1-(x^2)-(y^2))),{x,-2,2},{y,-2.5,2.5}, Mesh->All, MaxRecursion->0, PlotPoints->10, BoxRatios->Automatic]