【问题标题】:Connecting continuous and discrete data on two different axis in ggplot2在ggplot2中连接两个不同轴上的连续和离散数据
【发布时间】:2020-09-12 11:45:33
【问题描述】:

我有 200 个样本的连续数据,然后是相同样本的不同结果,但是离散的(Pos、Neg 和失败)。我以为我可以使用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

【问题讨论】:

  • 您可以发布示例数据吗?请使用dput(samples) 的输出编辑问题。或者,如果 dput(head(samples, 30)) 的输出太大。
  • 添加数据,抱歉!
  • ggplot2 的主要作者不喜欢使用第二个轴。他设计了这个包,让第二个轴变得非常困难,除非它是第一个轴的重新编码(摄氏与华氏)。如果你走那条路,预计会遇到麻烦。
  • 您不只是在寻找一个标准箱线图,其中 x 轴为离散值,y 轴为连续值吗?喜欢ggplot(samples, aes(discreteresult, PCRresult)) + geom_boxplot()

标签: r ggplot2 ggpubr


【解决方案1】:

如果我了解您想要做什么,我有一个解决方案,但它有点复杂。首先,我们有您的数据:

dat <- tibble::tribble(
  ~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)

接下来,我们需要找出三个点(正、负和失败)在同一 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", "Neg", "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", "discreteval"), 
                      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, labels=c("PCR", "Discrete")),
                              xend=factor(2, levels=1:2, labels=c("PCR", "Discrete")), 
                              y = PCRresult, yend=discreteval, 
                             colour=discreteresult), 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>


编辑 - 添加箱线图

要回答以下 cmets 中有关添加箱线图的问题 - 您可以添加箱线图。基本上,诀窍是通过将dat2 对象过滤为仅包含PCR 的对象来制作PCR 点的箱线图。然后您可以在箱线图几何中使用该数据,这将制作一个直接位于 PCR 点上方的箱线图。然后,您可以使用position = position_nudge(x=-.5) 将箱线图移动到点的左侧。我还使用了coord_cartesian() 来设置绘图的 x 限制。

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, labels=c("PCR", "Discrete")),
                             xend=factor(2, levels=1:2, labels=c("PCR", "Discrete")), 
                             y = PCRresult, yend=discreteval, 
                             colour=discreteresult), show.legend = FALSE) + 
  geom_boxplot(data=filter(dat2, var=="PCR"), 
               aes(x=var, y=vals), 
               position=position_nudge(x=-.5), width=.5) + 
  scale_y_continuous(sec.axis = sec_axis(trans = function(x){x}, breaks=x, labels=c("Positive", "Negative", "Fail"))) + 
  theme_bw() + 
  coord_cartesian(xlim=c(0.75,1.5)) + 
  labs(x="condition", y="Value")

【讨论】:

  • 是的,就是这样,谢谢!我以为我很天真,因为会有一个简单的方法。虽然似乎缺少一些数据点,但线和点比数据少?知道如何在左侧 (PCR) 数据中添加箱线图吗?
  • @asherichia 是的,我更新了答案以包括添加箱线图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2020-10-28
  • 1970-01-01
  • 2016-05-10
  • 2020-09-04
  • 2023-03-30
  • 2023-03-06
相关资源
最近更新 更多