Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib set_data for errorbar plot

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.

like image 279
parkus Avatar asked Oct 20 '22 03:10

parkus


1 Answers

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.

like image 64
Tong Avatar answered Oct 24 '22 01:10

Tong