Sibi
Sibi

Reputation: 55

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!

Upvotes: 3

Views: 9432

Answers (1)

Bart
Bart

Reputation: 10250

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

Upvotes: 4

Related Questions