我正在尝试创建一个堆积区域图。除了其中一个变量具有负值且未正确显示之外,我大部分都能够这样做。这是我的数据:
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
我得到了以下结果:
我们仍然可以看到颜色是混乱的。不知道为什么粉红色会在值变为负值时变为褐色。
答案 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()
给出:
当你想制作一个区域情节时,我猜你想要显示总数。您可以使用以下内容将其添加到绘图中:
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()
给出:
答案 1 :(得分:2)
我仍然没有将此视为堆积区域图,但您可以为每个变量创建两个组以分配负值和正值。这是一个非常粗略的草图,你可能会如何。
这里我假设您的示例数据位于名为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)
基本上我们只是创建一个功能区图表并自己进行堆叠。这将消除重叠。