【问题标题】:Adding Bars in background of Bargraph在条形图的背景中添加条形
【发布时间】:2015-05-31 13:48:49
【问题描述】:

我在图表背景中添加衰退条时遇到了一些问题。正确的方法是什么? 我试图为背景定义 geom_rect(.....) 但这没有正常工作。

这是我如何获取数据的代码:

library(quantmod)
library(dplyr)
library(ggplot2)


getSymbols("USPRIV",src="FRED")
getSymbols("USGOVT",src="FRED")

#convert data from quantmod into dataframes
uspriv.df <- data.frame(date= index(USPRIV),USPRIV$USPRIV)
usgovt.df <- data.frame(date= index(USGOVT),USGOVT$USGOVT)

#calculate month-to-month difference
d.uspriv <- dplyr::mutate(uspriv.df[-1,], duspriv = uspriv.df$USPRIV[-1]-uspriv.df$USPRIV[-nrow(uspriv.df)])
d.usgovt <- dplyr::mutate(usgovt.df[-1,], dusgovt = usgovt.df$USGOVT[-1]-usgovt.df$USGOVT[-nrow(usgovt.df)])

df <- dplyr::left_join(d.uspriv, d.usgovt, by = "date")

#shorten dataframe, starting in 2007
df.2007 <- dplyr::filter(df, date >= "2007-01-01") 
df1.2007 <- dplyr::select(df.2007, date, duspriv, dusgovt)

df1 <- melt(df1.2007, id="date")

ggplot(df1, aes(x=date, y=value)) + 
        geom_bar(aes(fill=variable), 
                     stat="identity",
                 position=position_dodge()) +
        scale_fill_brewer(palette="Dark2")

这会生成这个图表here

包含衰退条的最有效方法是什么? 这是获取数据的代码

getSymbols("USREC",src="FRED")

usrec.df <- data.frame(date= index(USREC), USREC$USREC)

如果我将衰退数据包含到数据框中然后将其融化,我将如何定义 ggplot 部分?

非常感谢。

【问题讨论】:

  • 请原谅我的无知,但究竟什么是“回归条”?
  • 指示经济是否陷入衰退的条形图。数据表明,值为 1 为衰退,值为 0 为非衰退。对困惑感到抱歉。此处示例:research.stlouisfed.org/fred2/series/GDP
  • 啊,好的。谢谢。是的,这可以做到,但我必须研究一下。其他人可能知道得更快。

标签: r ggplot2


【解决方案1】:

这是一个更强大的解决方案。当有多次衰退时它不应该失败(这句话的讽刺......)。感谢用户bergant。 注意:您仍然需要确保在您考虑的时间范围内有匹配的 USREC 数据。 我从1965开始做了一个例子。

library(quantmod)
library(dplyr)
library(reshape2)
library(ggplot2)


getSymbols("USPRIV",src="FRED")
getSymbols("USGOVT",src="FRED")

#convert data from quantmod into dataframes
uspriv.df = data.frame(date= index(USPRIV),USPRIV$USPRIV)
usgovt.df = data.frame(date= index(USGOVT),USGOVT$USGOVT)

#calculate month-to-month difference
d.uspriv = dplyr::mutate(uspriv.df[-1,], duspriv = uspriv.df$USPRIV[-1]-uspriv.df$USPRIV[-nrow(uspriv.df)])
d.usgovt = dplyr::mutate(usgovt.df[-1,], dusgovt = usgovt.df$USGOVT[-1]-usgovt.df$USGOVT[-nrow(usgovt.df)])

df = dplyr::left_join(d.uspriv, d.usgovt, by = "date")

#shorten dataframe, starting in 1965
df.1965 = dplyr::filter(df, date >= "1965-01-01") 
df1.1965 = dplyr::select(df.1965, date, duspriv, dusgovt)

df1 = melt(df1.1965, id="date")


#########
getSymbols("USREC",src="FRED")
usrec = data.frame(date= index(USREC), USREC$USREC)
rownames(usrec) = NULL

new_df = merge(df1, usrec)

##############

# Thanks go out to @bergant for this bit:
dif = diff(new_df$USREC)
new_df$Status = factor(c(0, dif) - 2 * c(dif, 0), levels = -3:3)
levels(new_df$Status) = c(rep(0, 4), "Start", "End", "Start&End")

##############

start_end_dt = data.frame(
            xmin = as.Date(new_df$date[new_df$Status == "Start"])
          , xmax = as.Date(new_df$date[new_df$Status == "End"])
)

##############

剩下的很简单:

ggplot(new_df, aes(x=date, y=value)) + 
  geom_rect(    inherit.aes = FALSE
              , data = start_end_dt
              , aes(xmin = xmin
                  , xmax = xmax
                  , ymin=-Inf
                  , ymax=+Inf)
              , fill='gray'
              , alpha=0.5) +
  geom_bar(aes(fill=variable), 
           stat="identity",
           position=position_dodge()) +
  scale_fill_brewer(palette="Dark2") +   
  theme_bw() + 
  theme( panel.grid.minor = element_blank(), panel.grid.major = element_blank() ) 

【讨论】:

  • 太棒了。非常感谢你。在这个例子中效果很好。如果有两个经济衰退时期,您知道如何应对吗?
  • 奇怪的是,我在这里遇到了一个非常相似的问题,就像我在处理自己的数据时遇到的问题一样,我必须在几周前分析。去图(双关语)。无论如何,@bergant 提供了一个很好的解决方案。还有其他人在:stackoverflow.com/questions/30560843/…
  • 我在这里遇到了这个...jeffreybreen.wordpress.com/2011/08/15/recession-bars 它适用于时间序列,而不适用于条形图。这种带有开始和结束的方法是否适用于条形图?
  • 好的。我已经解决了。 (创建了一个 start_end_dt)。希望这会有所帮助。
  • 没问题。如果您还不熟悉它,R Cookbook [Graphs] (cookbook-r.com/Graphs) 提供了有关让 ggplot2 做您想做的事情的重要信息。干杯。
猜你喜欢
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多