我是R的新手,并且ggplot和以下数据集(从较大的集合中选择代表)存在问题,其中geom_errorbar
条与均值(使用geom_point)不对齐,在某些情况下与水平横杠与geom_errorbar
中的竖杠不对齐,因此横杠与垂直线或偏心分开,而不是作为带有横杠顶部和底部的“ I”显示。
我已经查看了ggplot
,geom_point
,geom_errorbar
,position_jitter
(闪避,jitterdodge)的所有手册页。我还从这里尝试了很多方法,例如更改geom_point
和geom_errorbar
调用(例如How to make dodge in geom_bar agree with dodge in geom_errorbar, geom_point)中的美观
这是一个基本数据集:
df <- structure(list(
Test = c("A", "B", "C", "D", "A", "C", "D"),
mean = c(1, 100.793684, 1, 1, 51.615601, 1, 2.456456),
sd = c(1, 2.045985, 1, 1, 4.790053, 1, 4.250668),
lower = c(2, 102.839669, 2, 2, 56.405654, 2, 6.707124),
upper = c(0, 98.747699, 0, 0, 46.825548, 0, -1.79421)),
row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))
现在我正在使用的代码:
subplot <- ggplot(df, aes(x = Test, y = mean)) +
geom_point(aes(x= Test, y = mean),
position = position_jitter(width = 0.2, height = 0.2))+
geom_errorbar(aes(ymin = lower, ymax = upper),
width = 0.1,
position = position_jitter(width = 0.2, height = 0.2))
subplot
这就是我得到的:
我怀疑这是我错过的基本知识。我在折线图和其他散点图中使用了相同的代码,这很好,所以我对所做的事情一无所知。我也在单独的计算机上的两个不同的R安装环境中对其进行了测试。
任何帮助都将不胜感激。
答案 0 :(得分:2)
首先
Test = c("A", "B", "C", "D", "A", "C", "D")
mean = c(1, 100.793684, 1, 1, 51.615601, 1, 2.456456)
sd = c(1, 2.045985, 1, 1, 4.790053, 1, 4.250668)
lower = (mean+sd)
upper = (mean-sd)
range = 1:length(Test)
df <- data.frame(Test,mean,sd,lower,upper,range)
然后
subplot <- ggplot(df, aes(x = Test, y = mean,group=range)) +
geom_point(position = position_dodge(width = 0.2))+
geom_errorbar(aes(ymin = lower, ymax = upper),
width = 0.1, position = position_dodge(width = 0.2))
subplot
答案 1 :(得分:1)
看来position_jitter
应用于错误栏的不同组件的方式有所不同。好像是个错误。
这是一种解决方法,可以更直接地实现您的目标。添加一列(我在这里称其为version
)以区分一次测试的多次运行,并按该列group
进行区分,然后使用position_dodge
以避免重叠。
library(dplyr)
df2 <- df %>%
group_by(Test) %>%
mutate(version = row_number()) %>%
ungroup()
subplot <- ggplot(df2, aes(x = Test, y = mean, group = version)) +
geom_point(position = position_dodge(width = 0.5))+
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2,
position = position_dodge(width = 0.5))
subplot
或者,我们可以使用facet_grid并根据测试次数更改宽度,这将使误差线的宽度保持一致。
subplot <- ggplot(df2, aes(x = version, y = mean)) +
geom_point(position = position_dodge(width = 0.5))+
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2,
position = position_dodge(width = 0.5)) +
scale_x_continuous(breaks = NULL) +
facet_grid(.~Test, space = "free_x", shrink = T, scales = "free_x")
subplot
另一种方法是使用离散刻度,如您提到的,也许可以使用结合了Test和version的变量 为每个运行赋予相同的宽度。 (使用interaction(Test, version)
interaction
方法时,我无法按测试顺序进行排序。)
df2 <- df %>%
group_by(Test) %>%
mutate(version = row_number()) %>%
mutate(label = paste(Test, version)) %>%
ungroup()
subplot <- ggplot(df2, aes(x = label, y = mean)) +
geom_point(position = position_dodge(width = 0.5))+
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2,
position = position_dodge(width = 0.5))
subplot
答案 2 :(得分:1)
我将此数据集和问题发布到ggplot Github page。看来确实确实缺少一些简单的东西-我需要为geom_
调用设置种子,以使每个点始终保持抖动。但是,geom_errorbar
似乎存在问题,因为设置种子不能解决交叉开关问题。
根据进一步的调查(来自Github团队),似乎横梁独立于线路而抖动。 (到18/10/23为止)有一种解决方法可以解决此问题。同时使用position_dodge
或geom_linerange
。
ggplot(df, aes(x = Test, y = mean)) +
geom_point(aes(x= Test, y = mean),
position = position_jitter(width = 0.2, height = 0.2, seed = 123))+
geom_linerange(aes(ymin = lower, ymax = upper),
position = position_jitter(width = 0.2, height = 0.2, seed = 123))
感谢大家的帮助。