1

您好,我生成了以下内容:

在此处输入图像描述

使用以下代码:

 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
....

所以所有的位置都会被组合在一起,两边都有一个休息时间。我希望我说得通。是否有捷径可寻?

Ĵ

4

2 回答 2

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")

在此处输入图像描述

更新 - 空级别

其他可能性是在需要条形之间的空间(实际级别)的地方使用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"))

在此处输入图像描述

于 2013-06-20T18:47:08.870 回答
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")

在此处输入图像描述

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)
于 2013-06-20T10:54:25.820 回答