添加直接标签到ggplot2 geom_area图表

Idr*_*Idr 5 r ggplot2

这是此处问题的延续:使用ggplot2创建非重叠堆积区域图

我有一个由以下代码创建的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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我是全新的directlabels,并不确定如何使标签与图表的右侧对齐,使用与区域相同的颜色.

csg*_*pie 6

您可以使用简单geom_text添加标签.首先,将数据集子集化为最终x值:

dd=subset(dat, episode=="06-at-the-codfish-ball")
Run Code Online (Sandbox Code Playgroud)

然后按因子级别对数据框进行排序:

dd = dd[with(dd, order(name, levels(dd$name))),]
Run Code Online (Sandbox Code Playgroud)

然后算出绘图的累积百分比:

dd$cum = cumsum(dd$percent)
Run Code Online (Sandbox Code Playgroud)

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

g + geom_text(data=dd, aes(x=6, y=cum, label=name))
Run Code Online (Sandbox Code Playgroud)

哦,你可能想要调整x轴标签的角度以避免过度绘图:

g + opts(axis.text.x=theme_text(angle=-25, hjust=0.5, size = 8))
Run Code Online (Sandbox Code Playgroud)

图形

在此输入图像描述

  • @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”吗? (2认同)