Matplotlib's line2D
objects, such as those returned by a call to plot
, have a convenient method, set_data
, that let's me quickly update the values plotted by a single line without affecting the rest of the plot or the formatting of the line.
#sample plot
from matplotlib.pyplot import plot
p = plot(arange(10),arange(10))[0]
#now update the data
p.set_data(arange(10),arange(10)+2)
draw()
Is there any relatively simple (few lines of code) way to do the same with an errorbar
plot? I'd like to be able to set up a complicated plot with assorted text, arrows, lines, etc., then quickly cycle just the errorbar portion of the plot through several different sets of data.
The object returned by errorbar
seems to be pretty complex and so far my attempts at deleting and redrawing have failed.
Thanks to the help from @tacaswell.
Below is the python function that can both update xerr
and yerr
, as well as the x_data
and y_data
for the baseline plotting:
def adjustErrbarxy(self, errobj, x, y, x_error, y_error):
ln, (errx_top, errx_bot, erry_top, erry_bot), (barsx, barsy) = errobj
x_base = x
y_base = y
xerr_top = x_base + x_error
xerr_bot = x_base - x_error
yerr_top = y_base + y_error
yerr_bot = y_base - y_error
errx_top.set_xdata(xerr_top)
errx_bot.set_xdata(xerr_bot)
errx_top.set_ydata(y_base)
errx_bot.set_ydata(y_base)
erry_top.set_xdata(x_base)
erry_bot.set_xdata(x_base)
erry_top.set_ydata(yerr_top)
erry_bot.set_ydata(yerr_bot)
new_segments_x = [np.array([[xt, y], [xb,y]]) for xt, xb, y in zip(xerr_top, xerr_bot, y_base)]
new_segments_y = [np.array([[x, yt], [x,yb]]) for x, yt, yb in zip(x_base, yerr_top, yerr_bot)]
barsx.set_segments(new_segments_x)
barsy.set_segments(new_segments_y)
The first input parameter (self
is for python class) is the already created errorbar
plot handler, that is also the object whose properties need to be updated; x
and y
are the updated numpy
arrays which should be shown the average values along x
and y
axis; the last two parameters x_error
and y_error
are the errorbar
ranges calculated for x
and y
arrays. If only the errorbars are need to be updated, the x_base
and y_base
should be writen as ln.get_xdata()
and ln.get_ydata()
, respectively.
Up to now, the solution for the errorbar
updating in matplotlib
is truly non-trivial, hope it be much easier in the future versions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With