让数据在 ggplot 中达到限制而不是去 NA

Let data reach limits in ggplot instead of going NA

我正在尝试使用 ggplot2 绘制一些标准误差 (SE) 条。在此 set-up 中,我有显示典型 SE 条的粗条,但在这些条的顶部,我覆盖了显示 "alternative" SE 的细条(在数据标题 "se2" 下) .这些备选 SE 条总是比数据大。

我 运行 遇到的问题是大型替代 SE 被删除,警告消息告诉我有 2 行被删除,因为它们包含缺失值。我想要的只是为了显示这些值,如果替代 SE 栏达到我设置的限制,那么它会停在那里,仍然显示(暗示 reader 那么它继续过去)。

我发布了我正在使用的简化版本:

# Load packages
library(dplyr)
library(ggplot2)
library(ggpubr)

# Make dataframe for group 1

df_values1 <- data.frame(
  beta = c(0.07,0.04,0.3),
  se = c(.01,0.01,0.008),
  se2 = c(0.1,0.05,0.2),
  outcome = c("Name 1",
          "Name 2",
          "Name 3"),
  sample = c(rep("Group1",3))
)

# Make dataframe for group 2

df_values2 <- data.frame(
  beta = c(0.15,-0.04,0.03),
  se = c(.01,0.01,0.008),
  se2 = c(0.1,.2,0.05),
  outcome = c("Name 1",
          "Name 2",
          "Name 3"),
  sample = c(rep("Group2",3))
)

# Make dataframe for group 3

df_values3 <- data.frame(
  beta = c(0.22,0.18,-0.03),
  se = c(.01,0.01,0.008),
  se2 = c(1,0.05,0.01),
  outcome = c("Name 1",
          "Name 2",
          "Name 3"),
  sample = c(rep("Group3",3))
)

# Position dodge
pd <- position_dodge(0.7)

# Merge datasets
df_all <- rbind(df_values1, df_values2, df_values3)

# NOTE: use the levels of outcome from one of the non-merged datasets
df_all$outcome <- factor(df_all$outcome, levels = df_values1$outcome)

# Because the coordinates will be flipped, the order of the levels is 'reversed' here
df_all$sample <- factor(df_all$sample, levels = c('Group3', 'Group2', 'Group1'))


# Plot
picture <- ggplot(df_all, aes(x = outcome, y = beta, group = sample, colour = sample)) + 
  geom_hline(yintercept = c(-0.375, -0.125, 0.125, 0.375), size = 0.25, colour = 'grey95') +
  geom_errorbar(aes(ymin = beta-1.96*se, ymax = beta+1.96*se), width = 0, alpha = 1, size = 2, position = pd) +
  geom_errorbar(aes(ymin = beta-1.96*se2, ymax = beta+1.96*se2), width = 0, alpha = 1, size = 0.5, position = pd) +
  geom_hline(yintercept = 0, size = 0.25) + 
  guides(colour = guide_legend(reverse = TRUE), shape = guide_legend(reverse = TRUE)) + 
  ylim(-0.5,0.5) + 
  coord_flip() + 
  scale_x_discrete(limits = rev(levels(df_all$outcome)))

picture

Here is the picture of the result

我希望有一个解决方案可以适应上面示例中的两种情况:1) "Name 1" 的粉红色替代 SE 太大,因此理想情况下它们来自 end-to-end图表; 2) "Name 3" 的蓝色替代 SE 在右侧太大,但在左侧应该停在图中。所以在左边它停止在情节中但在右边继续直到它达到极限。谢谢!

请在此处查看两个答案:How to set limits for axes in ggplot2 R plots? 通常,coord_cartesian 用于防止数据被裁剪,但如果您使用 coord_flip,则可以在此范围内设置限制:

picture <- ggplot(df_all, aes(x = outcome, y = beta, group = sample, colour = sample)) + 
     geom_hline(yintercept = c(-0.375, -0.125, 0.125, 0.375), size = 0.25, colour = 'grey95') +
     geom_errorbar(aes(ymin = beta-1.96*se, ymax = beta+1.96*se), width = 0, alpha = 1, size = 2, position = pd) +
     geom_errorbar(aes(ymin = beta-1.96*se2, ymax = beta+1.96*se2), width = 0, alpha = 1, size = 0.5, position = pd) +
     geom_hline(yintercept = 0, size = 0.25) + 
     guides(colour = guide_legend(reverse = TRUE), shape = guide_legend(reverse = TRUE)) + 
     coord_flip(ylim = c(-0.5,0.5)) + 
     scale_x_discrete(limits = rev(levels(df_all$outcome)))