Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

In ListLinePlot, I'm attempting to construct my own ColorFunction for coloring points differently based on a third dimension of data not plotted to a specific axis. However, ColorFunction only uses variables corresponding to the specific data inserted, so that third dimension of data is not available internally. Therefore, if I want to use it in my plot, I have to reference it externally.

Here's an example setup:

data := Table[{Range[0, 2] + x}, {x, 0, 20}][[All, 1]]

Produces the following list:

{{0, 1, 2}, {1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}, {5, 6, 7}, {6,
   7, 8}, {7, 8, 9}, {8, 9, 10}, {9, 10, 11}, {10, 11, 12}, {11, 12, 
  13}, {12, 13, 14}, {13, 14, 15}, {14, 15, 16}, {15, 16, 17}, {16, 
  17, 18}, {17, 18, 19}, {18, 19, 20}, {19, 20, 21}, {20, 21, 22}}

Now, I want to plot this list as a 2D graph with the first and second entries corresponding to x and y, and the third entry corresponding to a color. Here's what I tried:

ListLinePlot[data[[All, {1, 2}]],
 ColorFunction -> Function[{x, y}, Hue[data[[x + 1, 3]]/22]]
 ]

This produces errors like this:

Part::pspec: Part specification 1.05` is neither a machine-sized integer nor a list of machine-sized integers. 
Part::pspec: Part specification 1.05` is neither a machine-sized integer nor a list of machine-sized integers. 
Part::pspec: Part specification 1.1` is neither a machine-sized integer nor a list of machine-sized integers. 
General::stop: Further output of Part::pspec will be suppressed during this calculation. 

The final output is a graph with variable but unexpected coloring. Substituting a regular number in for x in the ColorFunction's Function performs correctly (e.g., Function[{x, y}, Hue[data[[0 + 1, 3]]/22]]).

I can't see why I can't use given variables in a ColorFunction for referencing external objects. What have I done wrong? Why are these messages being generated, and what do they mean?

Update: here's the graph outputted by the version attempting to use x as an index:

share|improve this question
add comment

1 Answer

up vote 1 down vote accepted

The option ColorFunctionScaling defaults to True, therefore the x values passed to the ColorFunction are fractions between zero and one rather than integer indicies, and you cannot extract fractional parts. Add ColorFunctionScaling -> False to get the plot you want:

ListLinePlot[data[[All, {1, 2}]], 
  ColorFunction -> Function[{x, y}, Hue[data[[x + 1, 3]]/22]], 
  ColorFunctionScaling -> False
]

enter image description here

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.