69 votes

Comment changer la couleur des points de données en fonction de certaines variables ?

J'ai 2 variables (x,y) qui changent avec le temps (t). Je veux tracer x en fonction de t et colorer les tics en fonction de la valeur de y. Par exemple, pour les valeurs les plus élevées de y, la couleur du tick est vert foncé, pour la valeur la plus basse, rouge foncé, et pour les valeurs intermédiaires, la couleur sera échelonnée entre le vert et le rouge.

Peut-on faire cela avec matplotlib en python ?

107voto

Joe Kington Points 68089

C'est ce que matplotlib.pyplot.scatter est pour.

Si aucune carte de couleurs n'est spécifiée, scatter utilisera la carte de couleurs par défaut. Pour spécifier la carte de couleurs que scatter doit utiliser, utilisez la fonction cmap kwarg (par exemple cmap="jet" ).

Un exemple rapide :

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np

# Generate data...
t = np.linspace(0, 2 * np.pi, 20)
x = np.sin(t)
y = np.cos(t)

plt.scatter(t, x, c=y, ec='k')
plt.show()

enter image description here

On peut spécifier une carte de couleurs personnalisée et une norme

cmap, norm = mcolors.from_levels_and_colors([0, 2, 5, 6], ['red', 'green', 'blue'])
plt.scatter(x, y, c=t, cmap=cmap, norm=norm)

enter image description here

0 votes

Merci beaucoup. J'apprécie votre réponse rapide.

14voto

Paul Price Points 655

Si vous voulez tracer des lignes au lieu de points, voir cet exemple modifié ici pour tracer les points bons/mauvais représentant une fonction en noir/rouge selon le cas :

def plot(xx, yy, good):
    """Plot data

    Good parts are plotted as black, bad parts as red.

    Parameters
    ----------
    xx, yy : 1D arrays
        Data to plot.
    good : `numpy.ndarray`, boolean
        Boolean array indicating if point is good.
    """
    import numpy as np
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    from matplotlib.colors import from_levels_and_colors
    from matplotlib.collections import LineCollection
    cmap, norm = from_levels_and_colors([0.0, 0.5, 1.5], ['red', 'black'])
    points = np.array([xx, yy]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
    lines = LineCollection(segments, cmap=cmap, norm=norm)
    lines.set_array(good.astype(int))
    ax.add_collection(lines)
    plt.show()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X