使用岭图和散点图进行数据可视化

Data visulisation using ridge and scatter plot

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

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

下面是数据集类型的示例。 (我的包含大约 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 列中,虽然它们看起来相似,但是一个值的点数更多。

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

density plot type 已经完成了您想要的大部分工作,我们只需要将其叠加到您的数据中即可:

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

如果你想要水平子图,这很简单,你可以简单地在任一图上使用 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] 是一个很好的间隔,但您当然可以从数据 min/max.

中获取它
>>> 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]

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

>>> 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')