# ListPlot3D - How to make the Color depending on a second list

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?

• Welcome to StackExchange. Please format your question using the buttons provided at the top of the edit box. – Mr.Wizard Jun 7 '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 7 '12 at 12:06
• 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. is away Jun 7 '12 at 12:41

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]


• Thanks a lot for the fast help. Works great. – user1427 Jun 7 '12 at 15:20