1

类似于geom_area plot with area and outlines ggplot,我正在尝试构建一个带有轮廓的堆叠区域图。由于我的变量是离散的,我使用 geom_bar() 来堆叠它们。代码如下:

require(ggplot2)
require(reshape)
x = 0:4
y1 = c(3,2,2,1,0)
y2 = c(1,1,0,0,0)
data = data.frame(x,y1,y2)
data.plot <-melt(data, id.vars = "x")
cols = c(y1="darkgrey",y2="lightgrey") 
p = ggplot(data.plot,aes(x=x,y=value,fill=variable))
p +  geom_bar(aes(width=1),stat = "identity") + theme_bw() +  scale_fill_manual(values=cols) 

这使堆积条形图

我现在的问题是添加我提到的示例中的轮廓。我可以使用colour="black"geom_bar()但这会在条形之间添加垂直线,看起来很丑陋。

有没有人建议获得这些大纲?解决方案不必基于geom_bar.

如果可能的话,我也对只有深灰色部分有轮廓的解决方案感兴趣,因为这个轮廓有一个重要的解释。也许这可能是基于geom_line()?

4

2 回答 2

2

这是另一种方法,使用annotate("path"). 该建议对某些路径组件具有硬编码值,但我怀疑有一种方法可以通过算法填充这些值(可能使用gg_build().

p <- ggplot(data.plot,aes(x=x, y=value, fill=variable))
p <- p + geom_bar(aes(width=1), stat = "identity") + theme_bw() +  scale_fill_manual(values=cols)
p <- p + annotate(x=c(-.5, 0.5, 0.5, 2.5, 2.5, 3.5, 3.5),
                  y=c(3, 3,   2,   2,   1,   1,   0  ), group = 1,  "path", color = "black", size = 2)
p <- p + annotate(x=c(min(x)-.5, min(x)+0.5, min(x)+0.5, min(x)+2.5, min(x)+2.5, min(x)+3.5, min(x)+3.5),
                  y=c(max(value), max(value), max(value)- 1,  max(value)- 1,  max(value)- 2,  max(value)- 2,  min(value)), group = 1,  "path", color = "black", size = 2)
p

在此处输入图像描述

于 2015-06-01T13:57:45.657 回答
1

您的绘图代码(我不想使用c,因为这是一个函数):

p <- ggplot(data.plot, aes(x = x, y = value, fill = variable))
p <- p + geom_bar(aes(width = 1), stat = "identity") + theme_bw() +  scale_fill_manual(values = cols)

现在沿条添加一条步进线:

p <- p + geom_step(aes(x = x - 0.5), position = "stack")

沿着轴固定一条线需要做更多的工作:

library (dplyr)
y.max <- data.plot %>% group_by(x) %>% summarize(s = sum(value))
y.max <- max(y.max$s)    
p + geom_step(aes(x = x - 0.5, ymax = value), position = "stack") + 
      annotate('segment',
               x = min(data.plot$x) - 0.5,
               xend = min(data.plot$x) - 0.5,
               y = 0,
               yend = y.max) +
      annotate('segment',
               x = min(data.plot$x) - 0.5,
               xend = max(data.plot$x) - 0.5,
               y = 0,
               yend = 0)

阴谋

我会对更简单的解决方案感兴趣!

于 2015-06-01T13:27:12.883 回答