I have a time series of data for which I have the quantity, y, and its error, yerr. I would now like to create a plot that shows y against phase (i.e. time / period % 1) wit
Sorry to dig this back up, but just run into something similar myself and this was my solution based on previous responses.
This sets the marker, errorbars, and caps as the same colour in the colormap:
import matplotlib.pyplot as plt
import numpy as np
#data
time = np.arange(100.)
signal = time**2
error = np.ones(len(time))*1000
#create a scatter plot
sc = plt.scatter(time,signal,s=20,c=time)
#create colorbar according to the scatter plot
clb = plt.colorbar(sc)
#convert time to a color tuple using the colormap used for scatter
time_color = clb.to_rgba(time)
#loop over each data point to plot
for x, y, e, color in zip(time, signal, error, time_color):
plt.errorbar(x, y, e, lw=1, capsize=3, color=color)
EDIT: After changing to matplotlib v3.1.1 the above stopped working, but here's a workaround:
import matplotlib.pyplot as plt
import numpy as np
#data
time = np.arange(100.)
signal = time**2
error = np.ones(len(time))*1000
#create a scatter plot
sc = plt.scatter(time,signal,s=0,c=time)
#create colorbar according to the scatter plot
clb = plt.colorbar(sc)
#convert time to a color tuple using the colormap used for scatter
import matplotlib
import matplotlib.cm as cm
norm = matplotlib.colors.Normalize(vmin=min(signal), vmax=max(signal), clip=True)
mapper = cm.ScalarMappable(norm=norm, cmap='viridis')
time_color = np.array([(mapper.to_rgba(v)) for v in signal])
#loop over each data point to plot
for x, y, e, color in zip(time, signal, error, time_color):
plt.plot(x, y, 'o', color=color)
plt.errorbar(x, y, e, lw=1, capsize=3, color=color)
Finally for completeness, here's a plot of what it should produce: