我正试图创建一个堆叠的区域地块。大多数情况下,我都能够做到这一点,只是其中一个变量的值为负值,并且显示得不正确。以下是我的数据:
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")
下面是我得到的情节:
我们可以看到负值没有被正确地显示出来。我们如何正确地显示它们,使负值清晰可辨,并且位于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
我得到了以下结果:
我们仍然可以看到,这些颜色是有几分混乱的。不知道为什么当值变为负值时,粉红会变成棕色。
发布于 2014-09-11 18:05:20
我仍然不认为这是一个堆叠的区域图,但是您可以为每个变量创建两个组来对负值和正值进行分区。这是一个非常粗略的草图,说明你会怎样做。
在这里,我假设您的示例数据位于名为data.frame temp
的
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)
基本上,我们只是创建一个带状图,并做自己的堆叠。这将消除重叠。
发布于 2014-09-11 11:14:08
为什么不用线图呢?在我看来,这要好得多,尤其是消极的价值观:
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()
这意味着:
当你想要制作一个区域地块时,我想你也要显示总数。您可以通过以下方式将其添加到情节中:
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()
这意味着:
编辑:
我找到了一种方法把它黑进一个区域地块。如果您在熔化前的数据被称为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()
这意味着:
https://stackoverflow.com/questions/25795018
复制相似问题