Shaded uncertainty/error region in matplotlib.pyplot

Suuuehgi picture Suuuehgi · Jul 18, 2014 · Viewed 13k times · Source

I'm searching for a way to draw shaded error-regions instead of error-bars in Python.

I know that there is matplotlib.pyplot.fill_between() with which you can build a workaround for the y-error but that does not include the x-uncertainty.

problem_description

Any ideas? Unfortunately I had not enough reputation to put a comment here.

Thanks in advance!


Edit

matplotlib.pyplot.fill_betweenx() leads to something like:

fill_between_problem1


Edit 2

Furthermore I suppose it to be incorrect for a complete uncertainty area. Below I draw what I suppose to be the correct shape - I hope, I'm not wrong here...

problem_sketch

import numpy as np
import matplotlib.pyplot as plt

x = np.asarray([1.0, 2.0, 3.0, 4.0])
y = np.asarray([1.0, 2.3, 3.0, 4.0])
xerr = np.asarray([0.1, 0.7, 0.1, 0.1])
yerr = np.asarray([0.1, 0.9, 1.2, 0.1])

plt.errorbar(x, y, yerr, xerr)

plt.fill_between(x, y-yerr, y+yerr, facecolor='#F0F8FF', alpha=1.0, edgecolor='none')
plt.fill_betweenx(y,x-xerr, x+xerr, facecolor='#F0F8FF', alpha=1.0, edgecolor='#8F94CC', linewidth=1, linestyle='dashed')

plt.show()
# Red lines added with inkscape.

Answer

Schorsch picture Schorsch · Jul 18, 2014

I got this to work with the fill_betweenx function:

import numpy as np
import matplotlib.pyplot as plt

x = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0])
xerr = np.asarray([0.2, 0.4, 0.6, 0.8, 1.0])
yerr = np.asarray([0.1, 0.2, 0.3, 0.4, 0.5])

plt.errorbar(x, y, yerr, xerr)

plt.fill_between(x, y-yerr, y+yerr,facecolor='r',alpha=0.5)
plt.fill_betweenx(y,x-xerr,x+xerr,facecolor='b',alpha=0.5)

plt.show()  

Which results in this plot:

fill_between, fill_betweenx


EDIT

In your specific example, it may be sufficient to use:

plt.fill_between(x, y-yerr, y+yerr,facecolor='#F0F8FF',alpha=1.0,edgecolor='none')
plt.fill_betweenx(y,x-xerr, x+xerr,facecolor='#F0F8FF',alpha=1.0,edgecolor='none')

That way, you do not have edges, which would cross and give this "fold" away. Furthermore, it might generate a sufficient illusion of one error band. You'd have to use both the fill_between and fill_betweenx, though.