6

From a simulation (solid state physcis) i obtained a list1={{300,0,0},...} with x values=300,400,...,1500 and y-values=0,0.08,...,20 and z values. I plotted them using ListPlot3D.

I want to investigate the change in z value for fixed y, i.e. does z value change a lot for a given y in the range of all x values.

Therefore I want to make a coloring like this:

  1. If z' value of {x',y',z'} is equal to z value at {x=300,y',z} then it should be Gray
  2. If z' value of {x',y',z'} is lower than z value at {x=300,y',z}: going from Yellow to Red
  3. If z' value of {x',y',z'} is higher than z value at {x=300,y',z}: going from Green to Blue

How can I do that?

I tried the following:

  • Manipulation of list1 to get list2={0,0.3,...}, which has same amount of elements as points (x,y,z) in list1 and same ordering,

  • The values in list2 are 0.5 when point at same position in list1 satiesfies 1)

  • The values in list2 are < 0.5 when point at same position in list1 satiesfies 2)

  • The values in list2 are > 0.5 when point at same position in list1 satiesfies 3)

I tried to use a colorfunction:

colorf =  Blend[{{0, Blue}, {0.49, Green}, {0.5, Gray},{0.51, Yellow}, {1,Red}}, #] &;
ListPlot3D[list1,ColorFunction->colorf/@ list2]

I do get a coloring but not the correct one. I checked by exchanging all z values in list1 with values in list2 and made a density plot and colors are at different postions.

Is there any solution to make the color like I want to have it?

halirutan
  • 112,764
  • 7
  • 263
  • 474
user1427
  • 63
  • 1
  • 4
  • Welcome to StackExchange. Please format your question using the buttons provided at the top of the edit box. – Mr.Wizard Jun 07 '12 at 12:03
  • Hi and welcome too. I just edited you question to fix the formatting. If you want to fine-tune this, you can edit it again and look how I did things and additionally the help-button in the editor to see how you format things. The better your question looks, the more likely it is someone reads it. – halirutan Jun 07 '12 at 12:06
  • 2
    Help us help you. Can you post an example list1, and could you post pictures of what you've tried, and then explain why you're not satisfied with your pictures. – J. M.'s missing motivation Jun 07 '12 at 12:41

1 Answers1

11

To be honest, I'm surprised that you can actually provide a list of colours to ColorFunction. Normally you would specify ColorFunction -> func, where func is a function. The arguments provided to func depend on the function used to create the plot. For ListPlot3D they are the three spacial coordinates. To create a suitable function in this case, you could interpolate the points in list1 and list2.

Consider for example

list1 = N@{##, Cos[#] Cos[#2]} & @@@ Tuples[Range[0, 2 Pi, Pi/15], 2];
list2 = N@(1/2 + (Cos[#] Cos[#2] - Cos[#2])/2) & @@@ Tuples[Range[0, 2 Pi, Pi/15], 2]; 

We construct a function by interpolating the values in list2. This function is then used as the second argument of your Blend function to create a ColorFunction

interp = Interpolation[Transpose[{list1[[All, ;; 2]], list2}]];
colorf = Function[{x, y}, Blend[{{0, Blue}, {0.49, Green}, {0.5, Gray}, {0.51, Yellow}, 
  {1, Red}}, interp[x, y]]];

Which produces something like

ListPlot3D[list1, ColorFunction -> colorf, ColorFunctionScaling -> False]

Mathematica graphics

Heike
  • 35,858
  • 3
  • 108
  • 157