2012-05-01 130 views
5

这是问题在这里的延续:Create non-overlapping stacked area plot with ggplot2直接添加标签,GGPLOT2 geom_area图表

我有下面的代码创建了一个GGPLOT2面积图。我希望names的标签在图表的右侧对齐。我认为directlabels可能有效,但我愿意尝试任何最聪明的方法。

require(ggplot2) 
require(plyr) 
require(RColorBrewer) 
require(RCurl) 
require(directlabels) 

link <- getURL("http://dl.dropbox.com/u/25609375/so_data/final.txt") 
dat <- read.csv(textConnection(link), sep=' ', header=FALSE, 
     col.names=c('count', 'name', 'episode')) 


dat <- ddply(dat, .(episode), transform, percent = count/sum(count)) 

# needed to make geom_area not freak out because of missing value 
dat2 <- rbind(dat, data.frame(count = 0, name = 'lane', 
          episode = '02-tea-leaves', percent = 0)) 

g <- ggplot(arrange(dat2,name,episode), aes(x=episode,y=percent)) + 
    geom_area(aes(fill=name, group = name), position='stack') + scale_fill_brewer() 

g1 <- g + geom_dl(method='last.points', aes(label=name)) 

enter image description here

我是全新的,以directlabels并没有真正知道如何让标签对齐到具有相同颜色的区域图的右侧。

回答

5

您可以使用简单的geom_text添加标签。首先,子集您的数据集,以获得最终的x值:

dd=subset(dat, episode=="06-at-the-codfish-ball") 

然后通过因子水平责令数据帧:

dd = dd[with(dd, order(name, levels(dd$name))),] 

然后制定出累积百分比为策划:

dd$cum = cumsum(dd$percent) 

然后只需使用标准geom_text电话:

g + geom_text(data=dd, aes(x=6, y=cum, label=name)) 

哦,你可能希望你的角度x轴的标签,以避免过度策划:

g + opts(axis.text.x=theme_text(angle=-25, hjust=0.5, size = 8)) 

enter image description here

+0

感谢您的回答。我需要弄清楚直接标签,因为我不知道这种方法有多普遍。 – Idr

+0

@csgillespie,这很有用,谢谢。这里我使用的语法(另一个df):''+ geom_text(data = subset(df,Year ==“2012”),aes(x = Year,y = cumsum(value),label = variable),vjust = 6 ,hjust = -.2,size = 4)'',在那里我发现它很容易得到正确的vjust和hjust参数。我的意思是强调你可以将'cumsum'传递给''aes()'',这是我通过试验和错误发现的。对于右侧的图例,设置''+ guides(fill = guide_legend(reverse = TRUE))''来获得与图像相同顺序的颜色是很有用的。你想更新已弃用的“opts”吗? – PatrickT

+0

为了捕获数据帧的最后一个元素(在上面的注释中,“OP中的06-at-the-codfish-ball”和我上面注释中的“2012”),可以使用''tail()''函数与参数'1',例如''尾巴(df2.1 $ Year,1)'' – PatrickT