让数据在 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)))
我正在尝试使用 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)))