我得到的数据集看起来像这样
我试图在第一列上用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的非线性降维部分可能会有所帮助
答案 0 :(得分:4)
使用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
)定义的组。