Geom_point和geom_errorbar彼此不对齐

时间:2018-10-13 02:36:14

标签: r ggplot2

我是R的新手,并且ggplot和以下数据集(从较大的集合中选择代表)存在问题,其中geom_errorbar条与均值(使用geom_point)不对齐,在某些情况下与水平横杠与geom_errorbar中的竖杠不对齐,因此横杠与垂直线或偏心分开,而不是作为带有横杠顶部和底部的“ I”显示。

我已经查看了ggplotgeom_pointgeom_errorbarposition_jitter(闪避,jitterdodge)的所有手册页。我还从这里尝试了很多方法,例如更改geom_pointgeom_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

这就是我得到的:

Output of code above

我怀疑这是我错过的基本知识。我在折线图和其他散点图中使用了相同的代码,这很好,所以我对所做的事情一无所知。我也在单独的计算机上的两个不同的R安装环境中对其进行了测试。

任何帮助都将不胜感激。

3 个答案:

答案 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

image of plot

答案 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

enter image description here

或者,我们可以使用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

enter image description here

另一种方法是使用离散刻度,如您提到的,也许可以使用结合了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

enter image description here

答案 2 :(得分:1)

我将此数据集和问题发布到ggplot Github page。看来确实确实缺少一些简单的东西-我需要为geom_调用设置种子,以使每个点始终保持抖动。但是,geom_errorbar似乎存在问题,因为设置种子不能解决交叉开关问题。

根据进一步的调查(来自Github团队),似乎横梁独立于线路而抖动。 (到18/10/23为止)有一种解决方法可以解决此问题。同时使用position_dodgegeom_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))

感谢大家的帮助。