Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plot data without interpolation from former x value

I am doing some particle tracking at the moment. Therefore I want to plot the distribution and the cumulative function of the passing particles.

When I plot the distribution, my plot always starts one time step to early. Is there a way to just plot the event as a kind of peak, without any interpolation on the x axis?

Short example data is attached...

time = [ 0.,1.,2.,3.,4.,5.,6.,7.,8.,9.]
counts = [0,0,1,0,2,0,0,0,1,0]
cum = [ 0.,0.,0.25,0.25,0.75,0.75,0.75,0.75,1.,1.]

ax1 = plt.subplot2grid((1,2), (0, 0), colspan=1)
ax1.plot(time, counts, "-", label="Density")
ax1.set_xlim([0,time[-1]])
ax1.legend(loc = "upper left", frameon = False)
ax1.grid()

ax2 = plt.subplot2grid((1,2), (0, 1), rowspan=1)
ax2.step(time, cum, "r",where='post', label="Sum")
ax2.legend(loc = "upper left", frameon = False)
ax2.set_ylim([-0.05,1.05])
ax2.set_xlim([0,time[-1]])
ax2.grid()

plt.suptitle("Particle distribution \n")
plt.show()

enter image description here

Thanks for any help!

like image 641
Sibi Avatar asked Jan 23 '26 20:01

Sibi


1 Answers

There is no interpolation; with plot(.., '-'), matplotlib simply "connects the dots" (data coordinates that you provide). Either don't draw the line and use markers, e.g.:

ax1.plot(time, counts, "o", label="Density")

Or use e.g. bar() to draw "peaks":

ax1.bar(time, counts, width=0.001)

edit: Drawing bar()'s isn't ideal, as you are not drawing individual lines, but very small bars. It turns out that matplotlib actually has a function to draw the peaks: stem():

ax1.stem(time, counts, label="Density")

Which results in:

enter image description here

like image 91
Bart Avatar answered Jan 25 '26 10:01

Bart



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!