Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

[MatplotLib] Colorier sous la courbe entre deux points sur l'axe des abscisse.

+6 votes

Je tente tant bien que mal de colorier la partie inférieure de ma courbe entre deux positions sur l'axe des abscisses avec matplotlib. J'ai notamment utilisé les fonctions fillbetween() et fillbetweenx(), mais plus j'avance, plus je me perds dans leur utilisation. Pour l'instant j'arrive à restreindre le début de la fenêtre avec where, mais impossible d'ajouter une autre coordonnée. Ca ne doit pas être très compliqué mais la logique me manque ici.

def create_plot(data, xlim=None, ylim=None) :
#plt.plot(data[0], data[1])
x = np.array(data[0])
y = np.array(data[1])
ax = plt.subplot(111)
if xlim : ax.set_xlim(xlim)
if ylim : ax.set_ylim(ylim)
ax.fill_between(x, y, where=x>=100, facecolor='red')
plt.plot(x, y)
demandé 11-Mai-2015 par Jev (388 points)

Chez moi ton code fonctionne.
Tu peux donner le jeu de données que tu utilises ?

Edit : J'ai compris ton problème j'ajoute une réponse.

1 Réponse

+8 votes
 
Meilleure réponse

Dans ton fill_between tu peux ajouter dans la condition du where une seconde coordonnée :

ax.fill_between(x, y, where=(x>=2) & (x < 4), facecolor='red')
répondu 11-Mai-2015 par Hawke (466 points)
sélectionné 11-Mai-2015 par Jev

Merci de la réponse, ça répond parfaitement au problème. J'avais tenté un & au pif mais sans les parenthèses, pas de chance. Je me demandais aussi, est-il possible de démarrer la surface coloriées entre deux points ? Car j'ai l'impression que fill_between() ne peut commencer et finir que sur les points spécifiés en abscisses.

C'est-à-dire « démarrer la surface coloriées entre deux points » ?

Et bien si tu lances ça par exemple :

import pylab as plt
import numpy as np
x = np.array([i for i in range(0, 10,2)])
y = np.array([10,20,10,20,10])
ax = plt.subplot(111)
ax.fill_between(x, y, where=(x>1) & (x<7), facecolor='red')
plt.plot(x, y)
plt.show()

on peut remarquer que la borne commence uniquement à 2 et finit à 6. Ce qui est compréhensible dans le fonctionnement de la fonction, mais je me demandais si y'avait un trick pour que la surface commence réellement à 1 et finisse à 7.

Ça vient de tes données en abscisses, tu prends que les nombres pairs pour x donc tu ne peux pas faire commencer à 1 et finir à 7 dans ton cas.

Comme ça je dirais qu'il faut interpoler pour ajouter les points que tu veux dans ta courbe, mais c'est problématique d'altérer les données comme ça je pense.

Effectivement j'y avais déjà pensé et c'est ce que j'ai fini par faire. Du coup j'ai pondu un petit code que je poste ici dans le doute si quelqu'un se retrouve sur le même problème, c'est pas super codé mais ça marche pour ce que je recherche à faire : http://pastebin.com/Wy4xHtxN. Merci pour les réponses !

...