2016-11-14 114 views
2

我要使用的数据集和情节是从以前的问题就来了(Here)新增两个y轴标题:在同一轴线上

dat <- read.table(text = " Division Year OperatingIncome 
1 A 2012   11460 
2 B 2012   7431 
3 C 2012   -8121 
4 D 2012   15719 
5 E 2012    364 
6 A 2011   12211 
7 B 2011   6290 
8 C 2011   -2657 
9 D 2011   14657 
10 E 2011   1257 
11 A 2010   12895 
12 B 2010   5381 
13 C 2010   -2408 
14 D 2010   11849 
15 E 2010    517",header = TRUE,sep = "",row.names = 1) 

dat1 <- subset(dat,OperatingIncome >= 0) 
dat2 <- subset(dat,OperatingIncome < 0) 
ggplot() + 
    geom_bar(data = dat1, aes(x=Year, y=OperatingIncome, fill=Division),stat = "identity") + 
    geom_bar(data = dat2, aes(x=Year, y=OperatingIncome, fill=Division),stat = "identity") + 
    scale_fill_brewer(type = "seq", palette = 1) 

它包括以下情节,这就是我的问题进来:

Plot of interest

我的问题:是否有可能对我来说,y轴标签更改为两个不同的标签在同一侧?人们会说“负收入”,并且处于Y轴的底部。另一个会说“正收入”,并且位于同一个Y轴的上部。

我已经看到这个问题在不同尺度(在相反侧)上的双y轴问题,但我特别希望在相同的y轴上。感谢任何帮助 - 如果可能的话,我也希望使用ggplot2来解决这个问题。

+0

所以你要在两个地方添加文本在y轴? – rawr

+0

是的(但我也想控制每个y轴标题的开始位置)。 – EntryLevelR

+1

我想补充一点,我想让y轴上的每个标题独立于另一个。例如,也许我做一个蓝色和一个红色。 – EntryLevelR

回答

4

您可以使用annotate为负收入和正收入添加标签。要在绘图面板外添加文本,您需要关闭裁剪。下面是内外情节面板添加文本的例子:

# Plot 
p = ggplot() + 
    geom_bar(data = dat1, aes(x=Year, y=OperatingIncome, fill=Division),stat = "identity") + 
    geom_bar(data = dat2, aes(x=Year, y=OperatingIncome, fill=Division),stat = "identity") + 
    scale_fill_brewer(type = "seq", palette = 1) + 
    geom_hline(yintercept=0, lwd=0.3, colour="grey20") + 
    scale_x_continuous(breaks=sort(unique(dat$Year))) + 
    theme_bw() 

# Annotate inside plot area 
p + coord_cartesian(xlim=range(dat$Year) + c(-0.45,0.4)) + 
    annotate(min(dat$Year) - 0.53 , y=c(-5000,5000), label=c("Negative Income","Positive Income"), 
      geom="text", angle=90, hjust=0.5, size=3, colour=c("red","blue")) 

enter image description here

# Annotate outside plot area by turning off clipping 
pp = p + coord_cartesian(xlim=range(dat$Year) + c(-0.4,0.4)) + 
    annotate(min(dat$Year) - 0.9, y=c(-6000,10000), label=c("Negative Income","Positive Income"), 
      geom="text", angle=90, hjust=0.5, size=4, colour=c("red","blue")) + 
    labs(y="") 

pp <- ggplot_gtable(ggplot_build(pp)) 
pp$layout$clip <- "off" 
grid.draw(pp) 

enter image description here

您还可以使用cowplot通过@Gregor的建议。我以前没有尝试过,所以也许有比我在下面做的更好的方法,但是它看起来像您必须使用视口坐标而不是数据坐标来放置注释。

# Use cowplot 
library(cowplot) 

ggdraw() + 
    draw_plot(p + labs(y=""), 0,0,1,1) + 
    draw_label("Positive Income", x=0.01, y = 0.5, col="blue", size = 10, angle=90) + 
    draw_label("Negative Income", x=0.01, y = 0.15, col="red", size = 10, angle=90) 

enter image description here

我意识到在这个问题中的数据仅仅是为了说明,但对于这样的数据,一个线图可能被证明更容易理解:

library(dplyr) 

ggplot(dat, aes(x=Year, y=OperatingIncome, color=Division)) + 
    geom_hline(yintercept=0, lwd=0.3, colour="grey50") + 
    geom_line(position=position_dodge(0.2), alpha=0.5) + 
    geom_text(aes(label=Division), position=position_dodge(0.2), show.legend=FALSE) + 
    scale_x_continuous(breaks=sort(unique(dat$Year))) + 
    theme_bw() + 
    guides(colour=FALSE) + 
    geom_line(data=dat %>% group_by(Year) %>% summarise(Net=sum(OperatingIncome), Division=NA), 
      aes(x=Year, y=Net), alpha=0.4) + 
    geom_text(data=dat %>% group_by(Year) %>% summarise(Net=sum(OperatingIncome), Division=NA), 
      aes(x=Year, y=Net, label="Net"), colour="black") 

enter image description here

或者,如果需要条形图,可能是这样的:

ggplot() + 
    geom_bar(data = dat %>% arrange(OperatingIncome) %>% 
      mutate(Division=factor(Division,levels=unique(Division))), 
      aes(x=Year, y=OperatingIncome, fill=Division), 
      stat="identity", position="dodge") + 
    geom_hline(yintercept=0, lwd=0.3, colour="grey20") + 
    theme_bw() 

enter image description here

+0

一个很好的概述!我非常感谢你的多个例子 - 深思熟虑! – EntryLevelR