Julia 将标签传递到Plots.jl直方图

Julia 将标签传递到Plots.jl直方图,julia,plots.jl,Julia,Plots.jl,我是Julia的新手,想知道如何将标签传递到Plots.jl包中的直方图函数 using Plots gr() histogram( data[:sentiment_labels], title = "Hstogram of sentiment labels", xlabel = "Sentiment", ylabel = "count", label = ["Negative"

我是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]
)
只有第一个标签“负”出现在绘图中


所以简单的回答是:在你的图中只有一个标签,因为在你的图中只有一个数据系列-直方图只绘制一个数据系列,其中有一个标签附着在它上面。这可能看起来有点不寻常,你得到了多种颜色,但只有一个图例,所以我将解释为什么会发生这种情况,因为这很有启发性,而且是情节混乱的一个常见来源。jl用户我相信:

这是一个有点巧合,你得到三种不同的颜色为酒吧你正在绘制。这里发生的事情是,您提供了一个单独的
color
参数,该参数在柱状图中的条形图中循环使用。如果为
直方图提供更多颜色,您可以看到这一点

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]
)
给出:

实际上这里只传递了一个颜色参数。
直方图调用中颜色和标签之间的关键区别在于一个是行,另一个是列向量:

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

julia> [:coral, :slategrey, :dodgerblue]
3-element Array{Symbol,1}:
 :coral
 :slategrey
 :dodgerblue
Plots将第一个解释为适用于三个不同的系列(“负”是第一个系列的标签,“中性”是第二个系列,“正”是第三个系列),而第二个解释为仅适用于一个系列(因此,
:coral
:slategrey
:dodgerblue
都是第一个系列的颜色。这在Plots.jl中是一个相当微妙的区别,它经常让人绊倒(包括我!)

因此,要获得三个标签,您应该有三个系列来绘制直方图。一种方法是将情绪标签向量拆分为三个向量:

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

虽然我可能会争辩说,在您的情况下,
直方图
不是正确的工具-如果您的标签只会是负的、中性的和正的,一个简单的条形图就可以了,因为您不需要直方图提供的自动装箱功能。因此我可能会这样做:

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
)
要获得: