Как сделать точечный график на основе значений столбца в наборе данных?

Мне дан набор данных, который выглядит примерно так

данные

и я пытаюсь отобразить все точки с 1 в первом столбце отдельно от точек с 0, но я хочу поместить их в одну диаграмму.

Я знаю, что окончательный результат должен быть примерно таким: введите описание изображения здесь

Но я не могу найти способ отфильтровать точки в Джулии. Я использую LinearAlgebra, CSV, Plots, DataFrames для своего проекта, и до сих пор я не нашел способа заставить типы хранения DataFrames хорошо работать с функциями Plots. Я продолжаю сталкиваться с такими ошибками, как Cannot convert Float64 to series data for plotting, когда пытаюсь построить точки по отдельности с помощью цикла for в качестве фильтра, как показано в коде ниже.

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


person KeyboardHunter    schedule 07.05.2020    source источник
comment
Почему бы просто (необязательно: отсортировать таблицу по первому столбцу и) построить 2-й и 3-й столбцы как x-y, с цветом точки в зависимости от первого столбца?   -  person Kasey Chang    schedule 07.05.2020


Ответы (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) в этом случае.

person Bogumił Kamiński    schedule 07.05.2020
comment
Что делать, если мои данные не содержат заголовков? Как ссылаться на столбец в DataFrames без заголовка? - person KeyboardHunter; 07.05.2020
comment
Можете ли вы сказать мне две вещи: 1) какую версию DataFrames.jl вы используете, 2) что печатает names(df)? - person Bogumił Kamiński; 07.05.2020
comment
Я в последней версии DataFrames.jl (я переустановил ее вчера, потому что она работала с ошибками), и это то, что names(df) печатает 3-element Array{Symbol,1}: :Column1 :Column2 :Column3 - person KeyboardHunter; 07.05.2020
comment
Если он печатает вам Vector{Symbol}, это означает, что вы не используете последнюю версию DataFrames.jl (последняя возвращает Vector{String}). В любом случае - ваш фрейм данных имеет имена столбцов, как вы можете видеть - это :Column1, :Column2 и :Column3, и вы можете использовать эти имена для доступа к определенным столбцам. - person Bogumił Kamiński; 07.05.2020