N = 2000
total_bins = 10
X = np.random.random(size=N) * 10
Y = X ** 2 + np.random.random(size=N) * X * 10
bins = np.linspace(X.min(), X.max(), total_bins)
delta = bins[1] - bins[0]
idx = np.digitize(X, bins)
running_median = [np.median(Y[idx == k]) for k in range(total_bins)]
plt.scatter(X, Y, color='k', alpha=0.2, s=2)
plt.plot(bins - delta / 2, running_median, 'r--', lw=4, alpha=0.8)
plt.axis('tight')
plt.show()
Running median of y-values over a range of x