如何根据数据集中某列的值制作散点图?
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
,您可以使用这些名称访问特定列。以上是关于如何根据数据集中某列的值制作散点图?的主要内容,如果未能解决你的问题,请参考以下文章