堆积区域图未正确显示负值

时间:2014-09-11 18:51:55

标签: r plot ggplot2

我正在尝试创建一个堆积区域图。除了其中一个变量具有负值且未正确显示之外,我大部分都能够这样做。这是我的数据:

Time    A   B   C   D   E   F   G   H   I   J   K
11/1/2014   53438.819   0   1902.19 0   3620.333    12861.2876  0   315.61  0   34739.4 0
12/1/2014   53626.763   0   1908.88 0   3633.066    12906.5207  0   316.72  0   34861.58    0
1/1/2015    50744.951   0   1806.3  0   3437.831    12212.946   0   299.7   0   32988.17    0
2/1/2015    50807.599   0   1808.53 0   3442.075    12228.0237  0   300.07  0   33028.9 0
3/1/2015    50932.895   0   1812.99 0   3450.564    12258.1792  0   300.81  0   33110.35    0
4/1/2015    7264.046    8489.086    258.5685    1465.2215   25465.54    1748.2606   259.5347    42.9015 243.1085    -20251.22   6521.221
5/1/2015    7226.457    8445.158    257.2305    1457.6395   25203.163   1739.214    258.1918    42.6795 241.8505    -20015.83   6487.476
6/1/2015    7245.251    8467.122    257.8995    1461.4305   24940.787   1743.7373   258.8632    42.7905 242.4795    -19739.96   6504.349
7/1/2015    6906.952    8071.77 245.8575    1393.1925   24678.41    1662.3177   246.7763    40.7925 231.1575    -19720.43   6200.644
8/1/2015    7009.4  8191.496    243.1815    1378.0285   24416.033   1693.5511   244.0902    40.3485 228.6415    -19383.71   6340.736
9/1/2015    7019.042    8202.763    243.516 1379.924    24153.657   1695.8806   244.426 40.404  228.956 -19114.42   6349.457

我使用以下代码(在melt数据框之后)生成图:

p <- ggplot(temp, aes( Time, value)) + theme_bw() +ylab('Monthly Revenue') + xlab('') +
  scale_x_date(breaks=x_breaks, labels=x_labels)
p <- p + geom_area(aes(colour = variable, fill= variable), position = 'stack',alpha=0.6) +
  theme(axis.text.y=element_text(hjust=0, angle=0), 
        axis.text.x = element_text(hjust=1, angle=45),
        panel.grid.minor.x = element_blank(),
        panel.grid.minor.y = element_blank(),
        panel.grid.major.x=element_line(color='grey90',linetype='dashed'),
        panel.grid.major.y=element_line(color='grey90',linetype='dashed'),
        plot.title=element_text(size=20),
        axis.text=element_text(size=15),
        legend.text=element_text(size=15),
        legend.key=element_blank(),
        legend.title=element_blank()) +
  scale_y_continuous(label=thousand_formatter) +
  ggtitle('Any Title') + ylab("Dollars")

这是我得到的情节:

enter image description here

我们可以看到负值未正确显示。我们如何正确显示它们以使负值清晰可辨并且在X轴下?

非常感谢这方面的任何帮助。

修改

我现在使用了以下代码(这只是一个黑客,因为堆积区域图显示累积和,这也是我将负值添加到变量B的原因,因此负值的影响可能是偏移量):

temp <- temp[,c(1,11,2:10,12)]
temp[6:11,3] <- temp[6:11,3] + (-1 * temp[6:11,2])
temp <- melt(temp,id='Time')
p <- ggplot(temp, aes( Time, value)) + theme_bw() +ylab('Monthly Revenue') + xlab('') +
  scale_x_date(breaks=x_breaks, labels=x_labels)
p <- p + geom_area(aes(colour = variable, fill= variable), position = 'stack',alpha=0.6) +
  theme(axis.text.y=element_text(hjust=0, angle=0), 
        axis.text.x = element_text(hjust=1, angle=45),
        panel.grid.minor.x = element_blank(),
        panel.grid.minor.y = element_blank(),
        panel.grid.major.x=element_line(color='grey90',linetype='dashed'),
        panel.grid.major.y=element_line(color='grey90',linetype='dashed'),
        plot.title=element_text(size=20),
        axis.text=element_text(size=15),
        legend.text=element_text(size=15),
        legend.key=element_blank(),
        legend.title=element_blank()) +
  scale_y_continuous(label=thousand_formatter) +
  ggtitle('Any Title') + ylab("Dollars")
p

我得到了以下结果:

enter image description here

我们仍然可以看到颜色是混乱的。不知道为什么粉红色会在值变为负值时变为褐色。

2 个答案:

答案 0 :(得分:2)

为什么不使用线图?在我看来,情况要好得多,尤其是负值:

library(dplyr)
library(tidyr)
library(ggplot2)

temp <- df %>% gather(type, value, -Time)

ggplot(temp, aes(Time, value, group=type, colour=type)) + 
  geom_line(size=1) +
  theme_bw()

给出: enter image description here

当你想制作一个区域情节时,我猜你想要显示总数。您可以使用以下内容将其添加到绘图中:

df$all <- rowSums(df[,-1])

之后,你可以制作一个额外粗线的线图:

ggplot(temp[temp$type!="all",], aes(Time, value, group=type, colour=type)) + 
  geom_line(size=1) +
  geom_line(data=temp[temp$type=="all",], aes(Time, value), colour="black", size=1.5) +
  theme_bw()

给出: enter image description here


编辑:

我找到了一种将其破解成区域图的方法。假设您的数据帧在融化之前被称为df,您应该首先更改列的顺序:

df <- df[,c(1,11,6,2,3,4,5,7,8,9,10,12)]

而不是融化(假设你正在使用tidyr):

temp <- df %>% gather(type, value, -Time)

之后你可以用:

创建你的情节
ggplot(temp, aes(Time, value, group=type, colour=type)) + 
  geom_area(aes(colour=type, fill=type), alpha=0.4) +
  theme_bw()

给出: enter image description here

答案 1 :(得分:2)

我仍然没有将此视为堆积区域图,但您可以为每个变量创建两个组以分配负值和正值。这是一个非常粗略的草图,你可能会如何。

这里我假设您的示例数据位于名为temp

的data.frame中
tt<-melt(temp, id.vars="Time")
tt$pos <- tt$value>=0
gg<-expand.grid(Time=unique(tt$Time), pos=unique(tt$pos), variable=unique(tt$variable))
mm<-merge(tt, gg, all=T)
mm$value[is.na(mm$value)]<-0
mm$grp = interaction(mm$variable, factor(mm$pos, levels=c(TRUE,FALSE)))
mm$ymin<-with(mm, ave(value, pos, Time, FUN=function(x) cumsum(c(0,x[-length(x)]))))
mm$ymax<-with(mm, ave(value, pos, Time, FUN=cumsum))


ggplot(mm, aes(x=Time, fill=variable)) + theme_bw() + 
    geom_ribbon(aes(group=grp, color=variable, ymin=ymin, ymax=ymax), alpha=.6)

基本上我们只是创建一个功能区图表并自己进行堆叠。这将消除重叠。

enter image description here