Plotting 3D Function with Color Saturation in Mathematica

  • Context: Mathematica 
  • Thread starter Thread starter rohanprabhu
  • Start date Start date
  • Tags Tags
    Mathematica Plotting
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
6 replies · 14K views
rohanprabhu
Messages
410
Reaction score
2
I want to plot a function in 3D such that the saturation of the color at any point is given by:

[tex] S = f(x, y, z)[/tex]

so, when f(x, y, z) is maximum, i want the color at (x, y, z) to be say saturated Red [rgb(255, 255, 0)] and when it is minimum, i want the color to be white.

How do i do that in Mathematica?
 
Physics news on Phys.org
Are you talking about a surface in 3D colored? Or more like a density plot, say random particles.

If its the first:

F[x_, y_] = x/Exp[x^2 + y^2];
Plot3D[F[x, y], {x, -2, 2}, {y, -2, 2},
ColorFunction -> Function[{x, y, z}, RGBColor[1, 1 - z, 1 - z]]]

Sort of does what you ask.
 
Well.. in the example you gave, the function represents a set of points which satisfy a given condition. However, i want that each and every point is assigned a color, based on the co-ordinates of the point. How do i do that?
 
So you mean like a 3D density plot. If it drew a pixel at every coordinate, how would you see anything behind the front face of the data? Or are you looking for something like, at certain points its transparent and at others its not?

Because if its fully opaque you'll only see the bounds of the plot and no data inside. Even so I'll try to do it. I'm thinking your best approach (since there's no such thing as DensityPlot3D) is to have it draw a sphere or cube at each coordinate and color accordingly.

I've done something like this before when trying to make graphics for some 3D Crystalline grain growth simulations. Its a pain and I ended up making my own stuff using OpenDX (which I don't really recommend, its difficult).

so I guess let me ask you this, is your data a function of coordinates, or a table of datapoints?
 
K.J.Healey said:
So you mean like a 3D density plot. If it drew a pixel at every coordinate, how would you see anything behind the front face of the data? Or are you looking for something like, at certain points its transparent and at others its not?

Because if its fully opaque you'll only see the bounds of the plot and no data inside. Even so I'll try to do it. I'm thinking your best approach (since there's no such thing as DensityPlot3D) is to have it draw a sphere or cube at each coordinate and color accordingly.

I've done something like this before when trying to make graphics for some 3D Crystalline grain growth simulations. Its a pain and I ended up making my own stuff using OpenDX (which I don't really recommend, its difficult).

so I guess let me ask you this, is your data a function of coordinates, or a table of datapoints?

What I want to do is visualize the behavior of a Spherical Wave. The color at each point should give me the value of the.. let's say Electric Field if it is an EM Wave. Something like:

[tex] X = X_o Sin[k\sqrt{x^2 + y^2 + z^2} + \omega t][/tex]

and i want 't' to be manipulated by the parameter supplied through Animate[] rather than Manipulate[], but that's a different thing. Also, in the above case, the greater 'X' is.. the more opaque i want the color to be.
 
Yeah, that's basically a 3D density plot. I'll keep looking at it, but remember that what you're talking about isn't saturation, its the alpha channel.
The function Hue[h,s,b,a] the last channel is the alpha.
Maybe there's soemthing you can do in the plot where ColorFunction-> something with Hue[50,50,50,F[x,y,z]] or something.
 
Or do something like this:
(Where Alph is the function describing the transparency coordinates as a function of xyz)

F[x_, y_] = x/Exp[x^2 + y^2];
Alph[x_, y_, z_] = z; (*Anything here*)
Plot3D[F[x, y], {x, -2, 2}, {y, -2, 2},
ColorFunction ->
Function[{x, y, z}, RGBColor[1, 0, 0, Alph[x, y, z]]]]