问题描述
我有连续200个样本的数据,然后相同样本的不同结果却是离散的(正,负和失败)。我以为我可以使用ggpaired
和辅助轴来连接两组数据,但是运气不佳。对于连续数据,我需要一个箱线图,但是对于离散数据,我可以将数据连接到辅助轴上的特定点或分组。
基本,但是没有单独的轴,它大致满足了我的需求:
ggpaired(samples,cond1="discreteresult",cond2="PCRresult",id="sample")
但是最后得到的图形是所有图形都绘制在同一轴上
我以为我可以使用辅助轴?但是我尝试的一切似乎都无法让我保持联系吗?还有其他我可以尝试的软件包吗?我尝试过与ggalluvial
一起玩,但是那里也没有运气。任何帮助,不胜感激!
样本数据:
sample discreteresult PCRresult
OXPOS.001 Pos 35
OXPOS.002 Pos 29
OXPOS.003 Pos 25
OXPOS.004 Pos 28
OXPOS.005 Pos 31
OXPOS.006 Pos 25
OXPOS.007 Pos 32
OXPOS.008 Pos 26
OXPOS.009 Pos 28
OXPOS.010 Pos 29
OXPOS.011 Pos 35
OXPOS.012 Neg 32
OXPOS.013 Neg 35
OXPOS.014 Neg 26
OXPOS.015 Neg 30
OXPOS.016 Neg 30
OXPOS.017 Fail 27
OXPOS.018 Fail 41
OXPOS.019 Fail 12
OXPOS.020 Neg 22
解决方法
如果我了解您要执行的操作,则可以找到解决方案,但这有点复杂。首先,我们有您的数据:
dat <- tibble::tribble(
~sample,~discreteresult,~PCRresult,"OXPOS.001","Pos",35,"OXPOS.002",29,"OXPOS.003",25,"OXPOS.004",28,"OXPOS.005",31,"OXPOS.006","OXPOS.007",32,"OXPOS.008",26,"OXPOS.009","OXPOS.010","OXPOS.011","OXPOS.012","Neg","OXPOS.013","OXPOS.014","OXPOS.015",30,"OXPOS.016","OXPOS.017","Fail",27,"OXPOS.018",41,"OXPOS.019",12,"OXPOS.020",22)
接下来,我们需要弄清楚三个点(正,负和失败)在同一y轴上的位置。我将它们均匀地隔开(在下面的对象x
中):
library(tidyr)
library(dplyr)
library(ggplot2)
rg <- range(dat$PCRresult)
x <- rg[1] + diff(rg)/4 * 1:3
然后,我们从中创建一个数据集,并将其与原始数据合并:
vals <- tibble(
discreteresult = c("Pos","Fail"),discreteval = x)
dat <- left_join(dat,vals)
接下来,我们将这些新数据重新整理为长格式,以便变量var
标识结果是离散结果还是PCR结果。
dat2 <- dat %>%
pivot_longer(cols=c("PCRresult","discreteval"),names_to="var",values_to = "vals") %>%
mutate(var = factor(var,levels=c("PCRresult",labels=c("PCR","Discrete")))
然后,我们可以制作情节。分数来自dat2
。但是,在我们转向更广泛之前,这些细分来自数据对象。当两组不同的y
点位于不同的变量中时。然后,您可以指定实际上与主要y
轴具有相同比例的第二个轴,但是我们为不同的点颜色指定适当的断点和标签。
ggplot() +
geom_point(data=dat2,aes(x=var,y=vals,colour=discreteresult),show.legend = FALSE) +
geom_segment(data=dat,aes(x=factor(1,levels=1:2,"Discrete")),xend=factor(2,y = PCRresult,yend=discreteval,show.legend = FALSE) +
scale_y_continuous(sec.axis = sec_axis(trans = function(x){x},breaks=x,labels=c("Positive","Negative","Fail"))) +
theme_bw() +
labs(x="condition",y="Value")
如果我误解了任务,我深表歉意,但我认为这就是您要寻找的。 p>
编辑-添加了箱形图
要回答以下注释中有关添加箱形图的问题-您可以添加一个。基本上,诀窍是通过将dat2
对象过滤为仅包含PCR
的对象来绘制PCR点的箱线图。然后,您可以在箱线图几何中使用该数据,这将使箱线图直接位于PCR点上方。然后,您可以使用position = position_nudge(x=-.5)
将箱形图移至点的左侧。我还使用coord_cartesian()
设置了图的x极限。
ggplot() +
geom_point(data=dat2,show.legend = FALSE) +
geom_boxplot(data=filter(dat2,var=="PCR"),y=vals),position=position_nudge(x=-.5),width=.5) +
scale_y_continuous(sec.axis = sec_axis(trans = function(x){x},"Fail"))) +
theme_bw() +
coord_cartesian(xlim=c(0.75,1.5)) +
labs(x="condition",y="Value")