Я новичок в Джулии, и мне было интересно, как передать метки функции гистограммы в пакете Plots.jl.

using Plots
gr()
histogram(
    data[:sentiment_labels],
    title = "Hstogram of sentiment labels",
    xlabel = "Sentiment",
    ylabel = "count",
    label = ["Negative" "Positive" "Neutral"],
    fillcolor = [:coral,:dodgerblue,:slategray]
)

На графике появляется только первая метка «Негатив».

enter image description here

1
imantha 3 Ноя 2020 в 11:54

1 ответ

Лучший ответ

Итак, краткий ответ: на вашем графике только одна метка, потому что на вашем графике только одна серия данных - гистограмма отображает только одну серию данных, к которой прикреплена одна метка. Может показаться немного необычным, что вы получаете несколько цветов, но только одну легенду, поэтому я объясню, почему это происходит, поскольку это поучительно и, как мне кажется, частый источник путаницы для пользователей Plots.jl:

Это небольшое совпадение, что вы получаете столбцы трех разных цветов, которые вы строите. Здесь происходит то, что вы предоставляете единственный аргумент color, который циклически перебирается для столбцов гистограммы. Вы можете убедиться в этом, если добавите больше цветов для своего вызова histogram:

using Plots

sentiment_labels = [fill(-1, 200); fill(0, 700); fill(1, 100)]

histogram(
    sentiment_labels,
    fillcolor = [:coral, :red, :green, :dodgerblue, :slategray]
)

Дает:

enter image description here

Что тут происходит? Мы предоставили пять цветов, и оказалось, что ваша гистограмма имеет только полосу через каждые пять приращений (есть интервалы между -1, 0 и 1, просто в этих интервалах нет наблюдений). Таким образом, каждый пятый столбец имеет один и тот же цвет, и с исчезновением нулевых столбцов на графике будет виден только один цвет.

Другой способ увидеть это - иметь данные, которые более непрерывны, чем ваши ярлыки настроений:

cont_data = rand(1_000)

histogram(
    cont_data,
    fillcolor = [:coral, :red, :green, :dodgerblue, :slategray]
)

Дает:

enter image description here

Так что на самом деле здесь передается только один аргумент цвета. Ключевое различие между цветами и метками в вашем вызове histogram заключается в том, что один - это строка, а другой - вектор-столбец:

julia> ["Negative" "Neutral" "Positive"]
1×3 Array{String,2}:
 "Negative"  "Neutral"  "Positive"

julia> [:coral, :slategrey, :dodgerblue]
3-element Array{Symbol,1}:
 :coral
 :slategrey
 :dodgerblue

Графики интерпретируют первый из них как относящийся к трем разным сериям («Отрицательный» - это ярлык для первой серии, «Нейтральный» для второй, «Положительный» для третьей), а второй - как относящийся к одной серии. только (так что :coral, :slategrey, :dodgerblue - все цвета для первой переданной серии. Это довольно тонкое различие в Plots.jl, которое часто сбивает людей с толку (включая меня! )

Следовательно, чтобы получить три метки, у вас должно быть три ряда, для которых вы строите гистограммы. Один из способов сделать это - разделить вектор меток настроений на три вектора:

histogram(
    [filter(x -> x == y, sentiment_labels) for y ∈ -1:1],
    fillcolor = [:coral :dodgerblue :slategray],
    label = ["Negative" "Positive" "Neutral"]
)

Дает:

enter image description here

Хотя я бы, вероятно, возразил, что в вашем случае histogram - неподходящий инструмент - если ваши ярлыки будут только отрицательными, нейтральными и положительными, подойдет простая гистограмма, поскольку вам не нужно функция автоматического биннинга, предоставляемая гистограммой. Так что я бы, наверное, сделал:

bar(
    title = "Count of sentiment labels",
    xlabel = "Sentiment",
    ylabel = "count",
    [-1 0 1], [[sum(sentiment_labels .== x)] for x ∈ -1:1],
    label = ["Negative" "Positive" "Neutral"],
    fillcolor = [:coral :dodgerblue :slategray],
    linecolor = [:coral :dodgerblue :slategray],
    xticks = -1:1
)

Получить:

enter image description here

2
Nils Gudat 3 Ноя 2020 в 10:54