2015-10-18 77 views
0

我有数据帧像下面4年:[R ggplot barplot命名了它

State  Sex Year  Name Percent 
Arizona  M 1962  John 0.3 
Arizona  F 1962  Mary 0.6 
Arizona  M 1963  Peter 0.4 
Arizona  F 1963  Jane 0.9 
Arizona  M 1964  Dave 0.7 
Arizona  F 1964  Lara 0.3 
Arizona  M 1965  Den 0.7 
Arizona  F 1965  Kate 0.2 

我需要与人名称barplot在它每年却只有两种颜色,如绿色和红色。 一个实例是象下面这样:

enter image description here

所以在我的情况下:

  • x轴是年
  • y轴是百分比

数超过barplot是人名,而不是蓝色,我需要红色和绿色。

回答

2

这是一个解决方案。唯一的问题是文本标签的位置:你必须事先计算它们。我的解决方案假定每年只有两次观察,而且他们首先排序为M,第二次排序。

txt <- readLines(n=9) 
State  Sex Year  Name Percent 
Arizona  M 1962  John 0.3 
Arizona  F 1962  Mary 0.6 
Arizona  M 1963  Peter 0.4 
Arizona  F 1963  Jane 0.9 
Arizona  M 1964  Dave 0.7 
Arizona  F 1964  Lara 0.3 
Arizona  M 1965  Den 0.7 
Arizona  F 1965  Kate 0.2 
df <- read.table(text=txt,head=TRUE,stringsAsFactors = FALSE) 

library(ggplot2) 
library(dplyr) 

df <- group_by(df,Year) %>% 
    mutate(pos=ifelse(Sex=="M",Percent,Percent+lag(Percent))) 

ggplot(df,aes(x=Year,label=Name,fill=Sex)) + 
    geom_bar(aes(y=Percent),stat="identity",position="stack") + 
    geom_text(aes(y=pos),vjust=1) 

enter image description here

+0

THX SCOA。试过不为我工作。当我运行df < - group_by(df,Year)%>% mutate(pos = ifelse(性别==“M”,百分比,百分比+滞后(百分比)))我得到女性的NA列位置 – user1997567

+0

是的, 。我得到的pos值与男性的百分比相同,但女性的NA。我的barplot只显示男性的名字,其中一些代替了女性 – user1997567

+0

他们是否每年订购M第一F? 'lag()'将组中的前一个值,所以如果F是第一个,它将失败。在这种情况下,将其替换为lead()(下一个值)或last()(组中的最后一个值) – scoa

3

你可以用stat_summary做到这一切在ggplot放置文本为好。关键是使用cumsum来获得y位置。

ggplot(df, aes(x=Year, y=Percent, fill=Sex)) + 
    geom_bar(stat='identity') + 
    stat_summary(aes(label=Name, order=desc(Sex)), fun.y=cumsum, 
       position='stack', geom='text', vjust=1) 

enter image description here