如何根据数据集中某列的值制作散点图?

Posted

技术标签:

【中文标题】如何根据数据集中某列的值制作散点图?【英文标题】:How to make a scatter plot based on the values of a column in the data set? 【发布时间】:2020-08-22 08:31:34 【问题描述】:

我得到了一个看起来像这样的数据集

我正在尝试将第一列上所有带有 1 的点与带有 0 的点分开,但我想将它们放在同一个图表中。

我知道最终的结果应该是这样的

但我找不到过滤 Julia 中的点的方法。我正在为我的项目使用 LinearAlgebra、CSV、Plots、DataFrames,但到目前为止,我还没有找到一种方法让 DataFrames 存储类型与 Plots 函数很好地配合使用。当我尝试使用 for 循环作为过滤器单独绘制点时,我一直遇到Cannot convert Float64 to series data for plotting 之类的错误,如下面的代码所示

filter = select(data, :1)
newData = select(data, 2:3)

#graph one initial point to create the plot
plot(newData[1,1], newData[1,2], seriestype = :scatter, title = "My Scatter Plot")

#add the additional points with the 1 in front
for i in 2:size(newData)
    if filter[i] == 1
        plot!(newData[i, 1], newData[i, 2], seriestype = :scatter, title = "My Scatter Plot")
    end
end

其他方法给了我其他错误,但我没有记录那些。

我正在使用 Julia 1.4.0 和提到的所有软件包的最新版本。

快速编辑:

知道我正在尝试复制本文的非线性降维部分https://sebastianraschka.com/Articles/2014_kernel_pca.html#principal-component-analysis

可能会有所帮助

【问题讨论】:

为什么不只是(可选:按第一列对表格进行排序,并且)将第二和第三列绘制为 x-y,点的颜色取决于第一列? 【参考方案1】:

使用 Plots.jl,您可以执行以下操作(我传递的是完全可重现的代码):

julia> df = DataFrame(c=rand(Bool, 100), x = 2 .* rand(100) .- 1);

julia> df.y = ifelse.(df.c, 1, -1) .* df.x .^ 2;

julia> plot(df.x, df.y, color=ifelse.(df.c, "blue", "red"), seriestype=:scatter, legend=nothing)

但是,在这种情况下,我会另外使用 StatsPlots.jl,因为您可以这样写:

julia> using StatsPlots

julia> @df df plot(:x, :y, group=:c, seriestype=:scatter, legend=nothing)

如果您想按组手动执行,最简单的方法是使用groupby 函数:

julia> gdf = groupby(df, :c);

julia> summary(gdf) # check that we have 2 groups in data
"GroupedDataFrame with 2 groups based on key: c"

julia> plot(gdf[1].x, gdf[1].y, seriestype=:scatter, legend=nothing)

julia> plot!(gdf[2].x, gdf[2].y, seriestype=:scatter)

请注意,gdf 变量绑定到 GroupedDataFrame 对象,在这种情况下,您可以从中获取由分组列 (:c) 定义的组。

【讨论】:

如果我的数据不包含标题怎么办?如何在没有标题的情况下引用 DataFrames 中的列? 您能告诉我两件事吗:1)您使用的是哪个版本的 DataFrames.jl,2)names(df) 打印什么? 我使用的是最新版本的 DataFrames.jl(我昨天重新安装了它,因为它有问题),这就是 names(df) 打印 3-element ArraySymbol,1: :Column1 :Column2 :Column3 如果它打印你一个VectorSymbol,这意味着你不是最新版本的DataFrames.jl(最新返回一个VectorString)。无论如何 - 您的数据框有列名,如您所见 - 它们是 :Column1:Column2:Column3,您可以使用这些名称访问特定列。

以上是关于如何根据数据集中某列的值制作散点图?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 k-means 聚类散点图显示不同的结果?

如何根据动画图中的发生时间对 3D 散点图进行颜色编码?

excel绘制散点图时,如何进行分组绘图?

从 python 的 sklearn PCA 结果制作散点图

2018-10-31用R绘制散点图矩阵(成对的散点图)

R语言 散点图