0
$\begingroup$

I have a list of 10 values. I'm trying to plot the list using ListLinePlot, and using color function set by another list. The code is:

n = 9;
lis = Table[i, {i, 0, 1, 1/n}];
grad = {1, 9, 9, 9, 5, 5, 9, 9, 1, 1};
f = Interpolation[grad];
cf = Function[{x, f}, ColorData[{"AvocadoColors", {0, 9}}][f]];
ListLinePlot[lis, ColorFunction -> cf]

I have tried to set the color data for the values in grad, yet it does not seem to work. Also how can I plot the x-axis values as in the table?

EDIT - another problem:

I have a problem using interpolation when I'm trying to plot lis to scale. in this example:

n = 10;
lis = Table[i^4, {i, 0, 1, 1/n}];
grad = {1, 1, 9, 9, 9, 9, 9, 9, 10, 10, 10};
int = Interpolation[grad];
cf = Function[{x, f}, ColorData[{"AvocadoColors", {0, n}}][int[x]]];
cf2 = ColorData[{"AvocadoColors", {0, n}}] /@ grad;
g1 = ListLinePlot[lis, ColorFunction -> cf, ColorFunctionScaling -> False]
g2 = ListLinePlot[lis, ColorFunction -> cf2, ColorFunctionScaling -> False]
g3 = ListLinePlot[Table[{i, i^4}, {i, 0, 1, 1/n}], ColorFunction -> cf2, ColorFunctionScaling -> False]

g1 is color correctly, and for some reason g2 is not. when trying to plot the x axis to scale in g3 if I'm using cf it gives me errors for the interpolation function and using cf2 colors it in the wrong way as in g2. I'm not sure how to solve this.

$\endgroup$
2
$\begingroup$

I'm not 100% clear on what you want, but I assume that you want to actually plot grad on the y-axis, not lis. It also looks like you're trying to get "AvocadoColors" to scale from 0 to 9 instead of just the range of the data (1 to 9). If that's the case, my best guess at what you want is this:

n = 9;
lis = Subdivide[n];
grad = {1, 9, 9, 9, 5, 5, 9, 9, 1, 1};
cf = Function[{x, f}, ColorData[{"AvocadoColors", {0, 9}}][f]];
ListLinePlot[
  Transpose[{lis, grad}],
  ColorFunction -> cf,
  ColorFunctionScaling -> False
]

Since f is localized in the Function, you don't actually use your Interpolation in the code so I removed it. The important bit is to set ColorFunctionScaling -> False since you're defining your own scale. Otherwise, it will always try to feed the ColorFunction a value between 0 and 1.

You can also define your colours using Slot. I find it easier to read myself, but it just depends on what style you prefer.

n = 9;
lis = Subdivide[n];
grad = {1, 9, 9, 9, 5, 5, 9, 9, 1, 1};
ListLinePlot[
  Transpose[{lis, grad}], 
  ColorFunction -> (ColorData[{"AvocadoColors", {0, 9}}][#2] &), 
  ColorFunctionScaling -> False
]

For a 2D plot, slot #1 is x and slot #2 is f. For 3D plots you have x, y, and f. Some other plots have up to 5 possible numbers that can be delivered to ColorFunction. Either way the plot you get is:

enter image description here

EDIT 01:

Hopefully this will be closer to what you were looking for. I used the interpolation as you had it and just call it when I create cf.

n = 9;
lis = Table[i, {i, 0, 1, 1/n}];
grad = {1, 9, 9, 9, 5, 5, 9, 9, 1, 1};
int = Interpolation[grad];
cf = Function[{x, f}, ColorData[{"AvocadoColors", {0, 9}}][int[x]]];
ListLinePlot[
  lis, 
  ColorFunction -> cf, 
  ColorFunctionScaling -> False
]

enter image description here

$\endgroup$
6
  • $\begingroup$ As you can see, lis and grad are of the same size. I would like to plot lis, I just want that the color function would be set by grad, meaning the graph would be linear as lis, yet the color would be as the values of grad. meaning the graph would be linear, and in the beginning it would be black, then yellow ->green->yellow and black in the end. $\endgroup$
    – jonathan
    May 5 '21 at 20:40
  • $\begingroup$ @jonathan I see, it looks like I misunderstood. I've edited my answer. I think it's closer to what you're looking for. The only thing I'm not sure about is if you wanted to leave the x-axis as the numbers 1-10, but that should be easy enough to fix if you wanted something else. $\endgroup$
    – MassDefect
    May 5 '21 at 22:23
  • $\begingroup$ This helps, I have another question, If grad is long and Interpolation does not work, is there another way to create int[x]? Is there another expression that can replace int[x]? $\endgroup$
    – jonathan
    May 7 '21 at 20:07
  • $\begingroup$ @jonathan I don't see why interpolation wouldn't work. I can pretty easily interpolate tens of millions of points so length shouldn't be a problem. You could use the VertexColors option of Line and create your own graphic. Something like Graphics[ Line[ Transpose[{Range[Length[lis]], lis}], VertexColors -> ColorData[{"AvocadoColors", {0, 9}}] /@ grad ], Frame -> True ] $\endgroup$
    – MassDefect
    May 7 '21 at 21:21
  • $\begingroup$ I have another problem when trying to plot the x-axis to scale, can you look at the EDIT new part in the main question above? $\endgroup$
    – jonathan
    May 22 '21 at 14:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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