操纵绘图中数据点的位置

时间:2016-02-10 15:39:08

标签: r ggplot2

我有一个3列的简单数据框。第1列包含随时间收集的样品(A-D)。第2列标识数据中代表交互站点的链接对。在任何一个样本中最多可以有10个标识符对。第3列对(1-3)标识符之间的相互作用强度进行排序

第一项任务是对数据进行分箱和绘图。由于排名值是整数,我使用geom_jitter()将它们分配到bin中的备用位置。然后,我为每个唯一标识符对分配形状/颜色,以便我可以跟踪样本之间的单个对(即它们是否增加或减少等级)。

这就是我迄今所做的:

Sample <- c("A","A","A","B","B","C","C","D","D","D")
Rank <- c(3,3,1,3,3,2,3,3,2,1)
Site <- c(101202,102203,101201,102203,101202,101202,102203,102203,101201,101202)
DataSet <- as.data.frame(cbind(Sample,Rank,Site))
ggplot(data=DataSet, aes(x=Sample, y=Rank, group=factor(Site), colour = factor(Site))) + geom_jitter(aes(shape = factor(Site)),  size = 4) + geom_vline(xintercept=seq(0.5,length(unique(DataSet$Sample)), 1), lwd=0.5, colour="black",linetype = "dotted") + geom_hline(yintercept=seq(0.5, length(unique(DataSet$Rank))+0.5, 1), lwd=0.5, colour="black",linetype = "dotted") + scale_shape_manual(values=c(16:18)) + theme(legend.position="none", panel.background = element_rect(fill = "white"))

What I get

我的问题是:为了进一步帮助可视化,我想将每个唯一标识符对分配到bin中的相同位置。有没有办法实现这个目标?

为了说明我的意思,请找到提供的模拟数字。

What I want

因此,例如,蓝色的标识符对在样本A到D中排名为1,并且它在bin中的位置是相同的(即左上角)。绿色标识符对更改排名,但其位置位于相应bin的右下角。

1 个答案:

答案 0 :(得分:2)

这可能是一个开始。它基于以下思想:抖动是对点的x和y坐标的随机加法。因此,如果我们根据站点ID向x和y添加预定值,则点应出现在相同站点的相同位置。

首先,我们根据site-id生成相对位置的数据框。

position_data <- data.frame(id=1:10, 
                            x=c(rep(seq(-0.4,0.4,length.out=3),3),0),
                            y = rep(seq(0.4,-0.4,length.out=4),c(3,3,3,1)))

我们检查这个分布是我们想到的:

 ggplot(position_data, aes(x=x, y=y)) + geom_text(aes(label=id))

enter image description here

然后,我们将其与原始数据集合并:

#generate identifier
DataSet$Site_ID <- as.numeric(DataSet$Site)

plotdata <- merge(DataSet, position_data, by.x="Site_ID",by.y="id")

然后我们将x-es和y-s添加到Rank和Sample-positions:

plotdata$y <- plotdata$y + as.numeric(plotdata$Rank)
plotdata$x <- plotdata$x + as.numeric(plotdata$Sample)

现在我们可以绘制:

ggplot(data=plotdata, aes(x=x, y=y, group=factor(Site), colour = factor(Site),shape=factor(Site))) +
  geom_point(size=5)+
  geom_vline(xintercept=seq(0.5,length(unique(DataSet$Sample)), 1), lwd=0.5, colour="black",linetype = "dotted") + 
  geom_hline(yintercept=seq(0.5, length(unique(DataSet$Rank))+0.5, 1), lwd=0.5, colour="black",linetype = "dotted") + 
  scale_shape_manual(values=c(16:18)) + 
  theme(legend.position="none", panel.background = element_rect(fill = "white")) +
  scale_x_continuous(breaks=1:length(unique(plotdata$Sample)),labels=sort(unique(plotdata$Sample)),name="Sample") +
  scale_y_continuous(breaks=1:length(unique(plotdata$Rank)), labels=sort(unique(plotdata$Rank)),name="Rank")

请注意,我们的轴从因子变为数字,因此我们必须为两者添加自定义比例。

结果: enter image description here