I would like to plot one line graph. And the line has to change color based on the y-value. so for example:
red = 0 - 0.5
blue = 0.5 - 1
green = 1 - 1.5
black = 1.5 - 2
But I have also tried to make a extra column in my data frame which looks like this:
gradient result
date
2022-04-15 09:43:20 0.206947 E
2022-04-15 10:25:00 0.102620 E
2022-04-15 11:06:40 0.019450 C
2022-04-15 11:48:20 0.025945 D
2022-04-15 12:30:00 0.022455 D
... ...
2022-05-02 14:13:20 0.003770 A
2022-05-02 14:55:00 0.084120 E
2022-05-02 15:36:40 0.134970 E
2022-05-02 16:18:20 0.261385 E
2022-05-02 17:00:00 0.955833 NaN
So it can be also possible to make:
red = A
blue = C
green = D
black = E
I have found a script on the internet, but this does not work for me. This is the original script:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm
x = np.linspace(0, 3 * np.pi, 500)
y = np.sin(x)
dydx = np.cos(0.5 * (x[:-1] + x[1:])) # first derivative
# Create a set of line segments so that we can color them individually
# This creates the points as a N x 1 x 2 array so that we can stack points
# together easily to get the segments. The segments array for line collection
# needs to be (numlines) x (points per line) x 2 (for x and y)
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
fig, axs = plt.subplots(2, 1, sharex=True, sharey=True)
# Create a continuous norm to map from data points to colors
norm = plt.Normalize(dydx.min(), dydx.max())
lc = LineCollection(segments, cmap='viridis', norm=norm)
# Set the values used for colormapping
lc.set_array(dydx)
lc.set_linewidth(2)
line = axs[0].add_collection(lc)
fig.colorbar(line, ax=axs[0])
# Use a boundary norm instead
cmap = ListedColormap(['r', 'g', 'b'])
norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N)
lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)
line = axs[1].add_collection(lc)
fig.colorbar(line, ax=axs[1])
axs[0].set_xlim(x.min(), x.max())
axs[0].set_ylim(-1.1, 1.1)
plt.show()
It should show a graph that looks like this:
And I have tried to adapt the script to my own code:
x = data_646_mean.index
y = data_646_mean.gradient
dydx = y # first derivative
# Create a set of line segments so that we can color them individually
# This creates the points as a N x 1 x 2 array so that we can stack points
# together easily to get the segments. The segments array for line collection
# needs to be (numlines) x (points per line) x 2 (for x and y)
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
fig, axs = plt.subplots(2, 1, sharex=True, sharey=True)
# Use a boundary norm instead
cmap = ListedColormap(['r', 'g', 'b'])
norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N)
lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)
line = axs[1].add_collection(lc)
fig.colorbar(line, ax=axs[1])
axs[0].set_xlim(x.min(), x.max())
axs[0].set_ylim(-1.1, 1.1)
plt.show()
Which results in only good x-values:
It is doing something with a derivative which I do not understand. Does anyone know how to use this script or maybe another way. It does not matter if the color is defined by a extra column in the data frame or by a given interval.
Kind regards,
Simon
This is a example of the data, as the StackOverflow user 'a_guest' requested: