将xbreaks添加到ggplot

时间:2013-06-20 04:53:59

标签: r ggplot2 bar-chart

您好我已经生成了以下内容:

enter image description here

使用以下代码:

 library(ggplot2,quietly=TRUE)
 args <- commandArgs(TRUE)
 data <-read.table(args[1],header=T,sep="\t")
 pdf(args[2])
 p1 <- ggplot( data,aes(x=Mutation,y=difference) ) +
 geom_bar( width=.75,aes(fill=as.factor(position),stat="identity"),position="dodge") +
 geom_errorbar(aes(y=difference, ymin=difference-difference_std,   ymax=difference+difference_std )) +
 theme(legend.key = element_blank()) +
 ylab(expression(Delta*"Energy (Design - Wild Type)" )) +
 xlab( "Mutation" ) +
 ylim(-2.5,2.5) +
 theme_bw() +
 theme(axis.text.x = element_text(angle = 90,size=9,hjust=1))+
 opts(legend.position="none")+
 ggtitle(expression("PG9 Mutational Analysis"))
 p1
 dev.off()

正如您所看到的,我使用填充图层对位置进行了分组,因此您可以将它们组合在一起。理想情况下,虽然我希望在位置发生变化时在xbreak中休息,而不是按颜色对它们进行分组。

所以它会像橙条,橙条,休息,绿条,休息,青色酒吧,休息等......

*编辑:

以下是输入表中的数据:

position           Mutation       difference    difference_std
97             R97L             -0.3174848488298787 0.2867477631591484
97             R97N              0.5333956571765566 0.35232170408577224
99             A99H             -0.2294999853769939 0.24017957128601522
99             A99S             -0.45171049187057877    0.0013816966425459903
101            G101S             0.5315110947026147 0.08483810927415139
102            P102S            -0.04872141488960846    0.02890820273131048
103            D103Y             0.6692000007629395 0.07312815307204293
....

所以所有的位置都会被组合在一起,两边都有一个休息点。 我希望我有意义。有一个简单的方法吗?

Ĵ

2 个答案:

答案 0 :(得分:3)

我认为最简单的方法是使用分面(使用过的样本数据)。要获得分面的新变量,请首先根据Mutation订购数据框。然后添加新列pos2,根据列cumsum()使用diff()position添加数字序列(@agstudy的想法)。

df2<-df[order(df$Mutation),]
df2$pos2<-cumsum(c(0,diff(df2$position)) != 0)
df2
  position Mutation  difference difference_std pos2
3       99     A99H -0.22949999    0.240179571    0
4       99     A99S -0.45171049    0.001381697    0
7      103    D103Y  0.66920000    0.073128153    1
5      101    G101S  0.53151109    0.084838109    2
6      102    P102S -0.04872141    0.028908203    3
1       97     R97L -0.31748485    0.286747763    4
2       97     R97N  0.53339566    0.352321704    4

现在使用新列pos2进行构面。使用theme()strip.text=以及strip.background=,您可以删除条文和灰色背景。

ggplot(df2,aes(x=Mutation,y=difference) ) +
  geom_bar( width=.75,aes(fill=as.factor(position),
                   stat="identity"),position="dodge") +
  geom_errorbar(aes(y=difference, ymin=difference-difference_std,  
                   ymax=difference+difference_std )) +
  theme(legend.key = element_blank()) +
  ylim(-2.5,2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90,size=9,hjust=1))+
  theme(legend.position="none")+
  theme(strip.text=element_blank(),
        strip.background=element_blank())+
  facet_grid(.~pos2,scales="free_x",space="free_x")

enter image description here

更新 - 空级别

其他可能性是使用scale_x_discrete()和参数limits=并在需要空格(实际级别)之间的位置添加空白级别。此方法的问题是您需要手动添加这些级别。

例如,使用与前一个示例相同的数据(有序问题数据)。

ggplot(df2,aes(x=Mutation,y=difference) ) +
  geom_bar( width=.75,aes(fill=as.factor(position),
           stat="identity"),position="dodge") +
  geom_errorbar(aes(y=difference, ymin=difference-difference_std, 
            ymax=difference+difference_std )) +
  theme(legend.key = element_blank()) +
  ylim(-2.5,2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90,size=9,hjust=1))+
  theme(legend.position="none")+
  scale_x_discrete(limits=c("A99H", "A99S","", "D103Y","","G101S",
                             "","P102S","","R97L", "R97N"))

enter image description here

答案 1 :(得分:1)

我认为您首先需要创建一个对标签进行分组的新变量。

 dat$group <- cumsum(c(0,diff(dat$position)) != 0)

  Mutation  difference position group
20    0wYpO  0.93746859        4     0
17    63L00 -0.57833783        4     0
3     6hfEp -1.01620448        3     1
1     FvAz4  0.09496127        2     2
8     ghNTj -1.10180158        3     3
14    GxYzD  0.41997924        3     3

然后我认为这不会是一个为你的情节添加空白的简单方法。但您可以按组创建条形图,并使用geom_text添加基因名称。这里是第一个版本,我希望有更多经验丰富的ggplot2可以帮助调整中间的文本

ggplot( dat,aes(x=factor(group),y=difference) ) +
  geom_bar( width=.75,aes(fill=as.factor(Mutation)),stat="identity",
            position="dodge") +
  geom_text(aes(label=Mutation),position=position_dodge(height=0.9),angle=90)+
  theme_bw() + 
  opts(legend.position="none")

enter image description here

PS:以下代码可用于生成数据:

N <- 21
Mutation <- replicate(N,paste(sample(c(0:9, letters, LETTERS),
                                    5, replace=TRUE),
                             collapse=""))


difference <- rnorm(N)
position <- c(4, 4, 3, 2, 3, 3, 2, 3, 2,
              5, 2, 2, 2, 5, 5, 
              5, 2, 4, 5, 4, 2)
difference_std <- sd(difference)

dat <- data.frame(Mutation,difference)
dat <- dat[order(dat$Mutation),]
dat$position <- position
dat$group <- cumsum(c(0,diff(dat$position)) != 0)