Как вы можете сделать диаграмму с областями / линиями в Джулии с помощью Plots.jl? - PullRequest
0 голосов
/ 11 апреля 2019

Я хотел бы создать диаграмму областей с накоплением, похожую на эту , например, в Джулии, используя Графики.

Я знаю / предполагаю, что вы можете сделать это, если вы напрямую используете бэкенды Gadfly или PyPlot в Julia, но мне было интересно, есть ли рецепт для этого. Если нет, как вы можете внести свой вклад в рецепты сюжетов? Было бы полезным дополнением.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Рецепт чего-то похожего есть в

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 или, например,. на StatsPlots - здесь есть хорошее описание: https://docs.juliaplots.org/latest/contributing/

Это немного для чтения, но в целом полезно для ознакомления с участием в пакетах Julia.

0 голосов
/ 11 апреля 2019

Вы можете прочитать эту тему на дискурсивном форуме Джулии, где вопрос углубленно развивается.

Одно из опубликованных там решений с использованием графиков:

# 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 .

...