0

背景: 我正在研究 python,到目前为止,我有很多数据点(以 .CSV 形式)我有什么代码

  1. 读取 csv 和“结果”列
  2. 如果“结果”列中的值为正,则代码绘制与其对应的 ABCDEFG 参数,其中 y 轴是参数的值,x 轴是参数的名称。
  3. 如果这样的“结果”的数量超过 10,它会绘制与结果对应的前 10 个 ABCDEFG 参数。

下面是数据集类型的示例。(我的包含大约 12000 行)

数据集


  A     B       C     D       E     F    G    result
1.00   0.85  -0.999  0.27   0.98  0.39  0.80  -0.86
0.89   0.4   -0.6    0.47   0.28  0.29  0.26   0.65
0.65  -1.00   0.26   0.67  -0.88  0.29  0.10   0.50
0.98  -0.98   0.76   0.37   0.68  0.59  0.90      0
   0   0.5    0.56   0.27   0.38  0.79  0.48  -0.65 

编码 :

df = pd.read_csv("result.csv")
df.loc[df.result>0, df.columns[:-1]].T.plot(ls='', marker='o')

问题: 有时如果值相同,点标记在同一位置,因此很难看到频率分布(例如在下面的 B 和 C 列中,尽管它们看起来相似,但一个值有更多点。

我想要做的是在当前图表上绘制类似于脊图的东西(如下图所示),以便可以看到频率分布。我是这种数据可视化的新手。请指导我如何完成

在此处输入图像描述

4

1 回答 1

1

densityplot 类型已经做了你想要的,我们只需要将它叠加到你的数据中:

>>> data_to_plot = df.loc[df.result>0, df.columns[:-1]]
>>> data_to_plot.plot(kind='density')

基本 KDE 数据图

如果您想要水平子图,这很简单,您可以简单地subplots=True在任一图上使用(然后用列压缩返回的轴以叠加另一个图):

>>> axes = data_to_plot.plot(kind='density', subplots=True, legend=False)
>>> for ax, (colname, series) in zip(axes, data_to_plot.iteritems()):
...     ax.plot(series.values, np.zeros_like(series), ls='', marker='o')
...     ax.set_ylabel(colname)

在此处输入图像描述

但是,如果您希望它们垂直,我们可能必须自己计算高斯密度。Pandas 文档指向scipy.stats.gaussian_kde。为此,我们需要知道在哪些点插入内核。在您的示例中,看起来 [-1..1] 是一个很好的间隔,但您当然可以从数据最小值/最大值中获取它。

>>> from scipy.stats import gaussian_kde
>>> y = np.arange(-1, 1.01, .01)
>>> ridges = data_to_plot.apply(lambda s: gaussian_kde(s)(y))
>>> ridges
            A         B         C             D         E             F         G
0    0.001119  0.271510  0.270048  2.029737e-24  0.163222  2.352981e-15  0.000018
1    0.001247  0.272310  0.272122  4.796826e-24  0.164507  3.959987e-15  0.000021
2    0.001389  0.273071  0.274155  1.125941e-23  0.165765  6.637610e-15  0.000025
3    0.001545  0.273794  0.276145  2.624972e-23  0.166995  1.108083e-14  0.000030
4    0.001717  0.274479  0.278093  6.078288e-23  0.168200  1.842365e-14  0.000036
..        ...       ...       ...           ...       ...           ...       ...
196  0.939109  0.307535  0.314227  3.791151e-02  0.436305  3.153771e-01  0.630121
197  0.932996  0.304793  0.310216  3.100156e-02  0.431472  2.913782e-01  0.615406
198  0.926089  0.302012  0.306172  2.518140e-02  0.426576  2.682819e-01  0.600298
199  0.918401  0.299193  0.302097  2.031681e-02  0.421619  2.461581e-01  0.584834
200  0.909948  0.296337  0.297994  1.628194e-02  0.416607  2.250649e-01  0.569049

[201 rows x 7 columns]

然后像以前一样简单地使用拉链。可能需要进行一些调整,但这就是您的示例数据的样子。请注意山脊的缩放比例,因此它们都在相同的比例上,并且适合图上 0.5 宽的空间。

>>> ax = data_to_plot.T.plot(ls='', marker='o')
>>> for n, (colname, ridge) in enumerate(ridges.iteritems()):
...     ax.plot(ridge / (-2 * ridges.max().max()) + n, y, color='black')

带点的垂直脊

于 2021-06-18T11:41:41.877 回答