1

在 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)

结果是一条带有背景垂直带的递增线:

Stata中的背景垂直带

在 Julia with Gadfly 中,我能找到的最好的方法是人为的:

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:

Julia 中的背景垂直带与牛虻

为了删除笔触,我给主题一个返回透明白色的函数(如这个线程中所建议的那样)。我无法设置带的填充,所以我将默认颜色设置为灰色并添加了一个虚拟字段color以将线图的颜色从灰色更改为另一种颜色。我还从数据的最大值和最小值给出了垂直带的 y 坐标,这可能与视口的最大值和最小值不一致。

有人知道更好的方法吗?

4

3 回答 3

1

使用 Plots.jl 您只需添加一个vspan,例如:

vspan([1995, 1996], linecolor = :grey, fillcolor = :grey)
plot!(df[:year], df[:x])
于 2018-06-28T12:51:23.110 回答
0

在讨论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")
          )
)
于 2018-07-19T11:14:44.757 回答
0

这将需要一项不平凡的工作。

您可以基于Geom.vline,您需要在其中创建类似VBandGeometry(如VLineGeometry)的内容,并指定如何构建乐队(如render(::VLineGeometry)),正确获取限制Compose

于 2018-07-17T19:21:38.830 回答