差异图

时间:2014-10-08 03:15:19

标签: r ggplot2

我不知道这种情节的名称(欢迎提出这方面的意见)。基本上它是一个带有字形的条形图,它们被填充以表示损失/收益。字形像箭头一样编码有关方向,大小的信息,并允许看到下方的条形图。

enter image description here

这看起来很有趣,但无法在ggplot2(网格框架工作)中考虑如何做到这一点。我们怎么能在ggplot2 / grid框架中重新创建这个图(基础解决方案也欢迎问题的完整性)。特别是字形,而不是文本,因为这在ggplot2中非常直接。

以下是一些用于创建数据和传统覆盖的代码。坐标翻转躲避条形图和折线图,以显示可视化此类数据的典型方法。

set.seed(10)
x <- sample(30:60, 12)
y <- jitter(x, 60)

library(ggplot2)
dat <- data.frame(
    year = rep(2012:2013, each=12),
    month = rep(month.abb, 2),
    profit = c(x, y)
)


ggplot() + 
geom_bar(data=subset(dat, year==2012), aes(x=month, weight=profit)) +
geom_bar(data=subset(dat, year==2013), aes(x=month, weight=profit), width=.5, fill="red")

ggplot(dat, aes(x=month, fill=factor(year))) +
    geom_bar(position="dodge", aes(weight=profit)) +
    coord_flip

ggplot(dat, aes(x=month, y=profit, group = year, color=factor(year))) +
    geom_line(size=1) 

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:11)

这是一个例子,也许还有其他方法,

dat <- data.frame(
  year = rep(2012:2013, each=12),
  month = factor(rep(1:12, 2), labels=month.abb),
  profit = c(x, y)
)
dat2 <- reshape2::dcast(dat, month~ year, value.var = "profit")
names(dat2)[2:3] <- paste0("Y", names(dat2)[2:3])

ggplot(dat2) + 
  geom_bar(aes(x=month, y = Y2012), stat = "identity", fill = "grey80", width = 0.6) +
  geom_segment(aes(x=as.numeric(month)-0.4, xend = as.numeric(month)+0.4, y = Y2013, yend = Y2013)) + 
  geom_segment(aes(x = month, xend = month, y = Y2013, yend = Y2012, colour = Y2013 < Y2012), 
               arrow = arrow(60, type = "closed", length = unit(0.1, "inches")), size = 1.5) +
  theme_bw()

enter image description here