如果我了解您想要做什么,我有一个解决方案,但它有点复杂。首先,我们有您的数据:
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")