将标签传递给 Plots.jl 直方图

Passing labels to Plots.jl histogram

我是 Julia 的新手,想知道如何将标签传递给 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]
)

图中只有第一个标签“负”出现。

所以简短的回答是:你的图中只有一个标签,因为你的图中只有一个数据系列 - 直方图只绘制一个数据系列,它附有一个标签。你得到多种颜色但只有一个图例似乎有点不寻常,所以我将分解为什么会发生这种情况,因为它具有指导意义,并且我相信 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]
)

给出:

这里发生了什么?我们提供了五种颜色,事实证明您的直方图每五个增量只有一个条形(在 -1、0 和 1 之间有分箱,只是这些分箱中的观测值为零)。因此,每五个条具有相同的颜色,随着零条消失,我们最终只能在图中看到一种颜色。

另一种查看方式是拥有比您的情绪标签更连续的数据:

cont_data = rand(1_000)

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

给出:

所以实际上这里只传递了一个颜色参数。 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"]
)

给出:

尽管我可能会争辩说,在您的情况下,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
)

得到: