绘制散点图的轮廓

Draw the profile of a scatter plot

我有一个Lc和Fc值的散点图(请参考plot1)。

Lc= [360.66832393 388.26294316 392.9410819  ... 384.31751584 403.52581547
 384.22929343]

Fc= [77.3294787  47.5926941  44.53032575 ... 50.44012265 38.99666318
 50.54763385]

plot.scatter(Lc, Fc)

我想画出这个散点图的Fc曲线,如plot2所示。有人有有效的方法吗?

这里有一个想法,通过每个点绘制一条高斯曲线,然后取这些曲线的最大值。您可能想尝试曲线宽度。

import matplotlib.pyplot as plt
import numpy as np

low_lim = 30
fc = np.random.rand(120) * np.random.rand(120) * 120
fc = fc[fc > low_lim]
lc = np.random.uniform(50, 250, len(fc))

x = np.linspace(0, 300, 5000)
sigma = 15
ys = np.exp(- np.power((x.reshape(-1, 1) - lc) / sigma, 2) / 2) * fc
ymax = ys.max(axis=1)
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(15, 4))
for ax in (ax1, ax2):
    if ax == ax1:
        ax.plot(x, ymax, color='black', ls=':', lw=3)
        for l, f, y in zip(lc, fc, ys.T):
            ax.plot(x, y)
            ax.fill_between(x, 0, y, color='r', alpha=0.05)
    else:
        ax.plot(x, ymax, color='black', lw=2)
        ax.fill_between(x, 0, ymax, color='r', alpha=0.2)
    ax.scatter(lc, fc, color='darkorange')
    ax.axhline(low_lim, ls='--', color='skyblue')
    ax.set_ylim(ymin=0)
    ax.margins(x=0)
plt.tight_layout()
plt.show()

这里尝试平滑尖角,这可能适用于也可能不适用于您的数据。效果只是非常局部的;试图平滑更多导致也失去了一般形状。

from scipy.special import softmax

ys = np.exp(- np.power((x.reshape(-1, 1) - lc) / sigma, 2) / 2) * fc
softmax_weights = softmax(np.power(ys, 0.8), axis=1)
ymax = np.sum(ys * softmax_weights, axis=1)