微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ggplot2中的两个不同轴上连接连续数据和离散数据

如何解决在ggplot2中的两个不同轴上连接连续数据和离散数据

我有连续200个样本的数据,然后相同样本的不同结果却是离散的(正,负和失败)。我以为我可以使用ggpaired和辅助轴来连接两组数据,但是运气不佳。对于连续数据,我需要一个箱线图,但是对于离散数据,我可以将数据连接到辅助轴上的特定点或分组。

基本,但是没有单独的轴,它大致满足了我的需求:

ggpaired(samples,cond1="discreteresult",cond2="PCRresult",id="sample")

但是最后得到的图形是所有图形都绘制在同一轴上

ggpaired_data

我以为我可以使用辅助轴?但是我尝试的一切似乎都无法让我保持联系吗?还有其他我可以尝试的软件包吗?我尝试过与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")

enter image description here

如果我误解了任务,我深表歉意,但我认为这就是您要寻找的。​​ 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")

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。