使用岭图和散点图进行数据可视化
Data visulisation using ridge and scatter plot
背景:
我正在研究 python,我有很多数据点(以 .CSV 格式)到目前为止我有什么代码
- 读取 csv 和“结果”列
- 如果“结果”列中的值为正数,则代码绘制与其对应的 A B C D E F G 参数,其中 y 轴是参数的值,x 轴是名称参数.
- 如果这样的“结果”的数量超过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')
背景: 我正在研究 python,我有很多数据点(以 .CSV 格式)到目前为止我有什么代码
- 读取 csv 和“结果”列
- 如果“结果”列中的值为正数,则代码绘制与其对应的 A B C D E F G 参数,其中 y 轴是参数的值,x 轴是名称参数.
- 如果这样的“结果”的数量超过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')