Tracez yerr / xerr comme une région ombrée plutôt que comme des barres d'erreur


Réponses:


151

En ignorant l'interpolation fluide entre les points de votre exemple de graphique (qui nécessiterait une interpolation manuelle, ou simplement une résolution plus élevée de vos données), vous pouvez utiliser pyplot.fill_between():

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0, 30, 30)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape)
y += np.random.normal(0, 0.1, size=y.shape)

plt.plot(x, y, 'k-')
plt.fill_between(x, y-error, y+error)
plt.show()

entrez la description de l'image ici

Voir aussi les exemples matplotlib .


1
Parfait. Ouais, je ne voulais pas inclure un exemple avec des lignes lissées.
Austin Richardson

Une idée comment faire de ce spectacle des boîtes ombrées au lieu d'une bande ombrée? Mon premier instinct a été d'abuser lwmais il semble ne pas utiliser les mêmes unités que les haches.
Benjamin Bannier

@BenjaminBannier Je ne suis pas tout à fait sûr de ce que vous voulez dire. Il semble que vous souhaitiez une boîte dessinée à chaque point, sa hauteur est la même que celle de la barre d'erreur, tandis que la largeur doit être telle qu'ils connectent (touchent) les boîtes voisines. Est-ce exact?

1
@EL_DON Vous voulez dire que vous aimeriez une légende avec une ligne noire + une bande bleue, et le texte serait quelque chose comme "données + 1 région d'erreur sigma"?

1
@Allan si les seules barres d'erreur que vous avez sont horizontales, vous devriez probablement retourner les axes de votre problème réel (et donc aussi la figure). Normalement, la variable indépendante est celle sans (ou avec de très petites) barres d'erreur. Vous pourrez peut-être tricher, en échangeant vos variables de données, et dans matplotlib, en échangeant également les axes.

131

C'est fondamentalement la même réponse fournie par Evert , mais étendue pour montrer quelques options intéressantes defill_between

entrez la description de l'image ici

from matplotlib import pyplot as pl
import numpy as np

pl.clf()
pl.hold(1)

x = np.linspace(0, 30, 100)
y = np.sin(x) * 0.5
pl.plot(x, y, '-k')


x = np.linspace(0, 30, 30)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape) +.1
y += np.random.normal(0, 0.1, size=y.shape)

pl.plot(x, y, 'k', color='#CC4F1B')
pl.fill_between(x, y-error, y+error,
    alpha=0.5, edgecolor='#CC4F1B', facecolor='#FF9848')

y = np.cos(x/6*np.pi)    
error = np.random.rand(len(y)) * 0.5
y += np.random.normal(0, 0.1, size=y.shape)
pl.plot(x, y, 'k', color='#1B2ACC')
pl.fill_between(x, y-error, y+error,
    alpha=0.2, edgecolor='#1B2ACC', facecolor='#089FFF',
    linewidth=4, linestyle='dashdot', antialiased=True)



y = np.cos(x/6*np.pi)  + np.sin(x/3*np.pi)  
error = np.random.rand(len(y)) * 0.5
y += np.random.normal(0, 0.1, size=y.shape)
pl.plot(x, y, 'k', color='#3F7F4C')
pl.fill_between(x, y-error, y+error,
    alpha=1, edgecolor='#3F7F4C', facecolor='#7EFF99',
    linewidth=0)



pl.show()

1
Solution légèrement meilleure: stackoverflow.com/questions/43064524/…
Shital Shah
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.