如何使用 Plots.jl 在 Julia 中制作堆积面积图/折线图?

How can you make a stacked area / line chart in Julia with Plots.jl?

我想创建一个堆积面积图,类似于 to this 例如,在 Julia 中使用 Plots。

我知道/假设如果你直接在 Julia 中使用 Gadfly 或 PyPlot 后端,你可以做到这一点,但我想知道是否有这方面的秘诀。如果没有,您如何为 Plots Recipes 做出贡献?将是一个有用的补充。

中有类似的食谱

https://docs.juliaplots.org/latest/examples/pgfplots/#portfolio-composition-maps

由于某种原因,缩略图现在看起来已损坏(但代码有效)。

matlab 示例中的确切图可以由

生成
plot(cumsum(Y, dims = 2)[:,end:-1:1], fill = 0, lc = :black)

食谱看起来像

@userplot AreaChart
@recipe function f(a::AreaChart)
         fillto --> 0
         linecolor --> :black
         seriestype --> :path
         cumsum(a.args[1], dims = 2)[:,end:-1:1]
       end

如果你想为 Plots 贡献一个食谱,你可以在 Plots 上打开一个 pull request,或者,例如。在 StatsPlots - 这里有一个很好的贡献描述:https://docs.juliaplots.org/latest/contributing/

需要一点阅读,但作为对 Julia 包的贡献的介绍非常有用。

你可以在Julia discourse forum上阅读this thread,这个问题有很深的发展。

那里发布的一个使用 Plots 的解决方案是:

# a simple "recipe" for Plots.jl to get stacked area plots
# usage: stackedarea(xvector, datamatrix, plotsoptions)
@recipe function f(pc::StackedArea)
    x, y = pc.args
    n = length(x)
    y = cumsum(y, dims=2)
    seriestype := :shape

    # create a filled polygon for each item
    for c=1:size(y,2)
        sx = vcat(x, reverse(x))
        sy = vcat(y[:,c], c==1 ? zeros(n) : reverse(y[:,c-1]))
        @series (sx, sy)
    end
end

a = [1,1,1,1.5,2,3]
b = [0.5,0.6,0.4,0.3,0.3,0.2]
c = [2,1.8,2.2,3.3,2.5,1.8]
sNames = ["a","b","c"]
x = [2001,2002,2003,2004,2005,2006]

plotly()
stackedarea(x, [a b c], labels=reshape(sNames, (1,3)))

(用户 NiclasMattsson)

那里介绍的其他方法包括使用 VegaLite.jl 包。