Как легко построить фоновые вертикальные полосы? - PullRequest
0 голосов
/ 27 июня 2018

В Stata я могу легко добавлять полосы на заднем плане, например, сигнализировать о периоде спада:

clear
set obs 2
gen year = 1990
replace year = 2000 if _n == 2
gen x = 0
replace x = 1 if _n == 2

twoway ///
    (scatteri 1 `=' 1995 1 `=' 1996, bcolor(gs10) recast(area) lwidth(none)) ///
    (line x year)

В результате получается растущая линия с фоновой вертикальной полосой:

Background vertical bands in Stata

В Джулии с Оводом лучшее, что я смог найти, было изобретено:

using Gadfly, DataFrames, Colors

df = DataFrame(year = [1990; 2000], x = [0; 1], color = [1; 1])

x_shade = [1995 1995 1996 1996]
y_shade = [0 1 1 0]

theme = Theme(
    discrete_highlight_color = u -> ARGB(1, 1, 1, 0),
    default_color = colorant"grey")

p = plot(
    layer(
        x = x_shade,
        y = y_shade,
        Geom.polygon(preserve_order = true, fill = true),
        order = 1
    ),
    layer(df,
          y = "x",
          x = "year",
          color = "color",
          Geom.line,
          order = 2
          ),
    theme
)        

Результат похож на Stata:

Background vertical bands in Julia with Gadfly

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

Кто-нибудь знает лучший способ?

Ответы [ 3 ]

0 голосов
/ 17 июля 2018

Это потребует нетривиальной работы.

Вы можете использовать Geom.vline , где вам нужно будет создать что-то вроде VBandGeometry (например, VLineGeometry ), и указать, как построить группу (например, * 1008). *render(::VLineGeometry)), получение лимитов правильно на Compose

0 голосов
/ 19 июля 2018

После обсуждения проблемы GitHub один участник предложил Geom.rect, что требует добавления минимума и максимума для оси y:

using Gadfly, DataFrames

df = DataFrame(year = [1990; 2000], x = [0; 1], color = [1; 1])

recessions = DataFrame(peaks = [1995],
                       troughs = [1996],
                       ymin = minimum(df[:x]),
                       ymax = maximum(df[:x]))

plot(
    recessions,
    xmin = :peaks,
    xmax = :troughs,
    ymin = :ymin,
    ymax = :ymax,
    Geom.rect,
    Theme(default_color = colorant"grey"),
    layer(df,
          y = "x",
          x = "year",
          Geom.line,
          order = 2,
          Theme(default_color = colorant"black")
          )
)
0 голосов
/ 28 июня 2018

С помощью Plots.jl вы можете просто добавить vspan, например ::

vspan([1995, 1996], linecolor = :grey, fillcolor = :grey)
plot!(df[:year], df[:x])
...