我一直在尝试重新创建与最初在Stata中创建的图表类似的图表(请参见下图)。
这是我到目前为止在R中尝试过的内容:
df2 <- data.frame(matrix(0, ncol = 3, nrow = 10))
row.names(df2) <- c("FB", "IG", "Network TV News", "Local TV News", "Cable News", "Print Newspapers", "Radio", "Friends and Family", "Online News", "YouTube")
df2$X1 <- runif(10, min = -2, max = -1.5)
df2$X2 <- runif(10, min = -1.5, max = 0.5)
df2$X3 <- runif(10, min = 0.5, max = 2)
df2_names <- factor(row.names(df2), levels = c("YouTube", "Online News", "Friends and Family", "Radio", "Print Newspapers", "Cable News", "Local TV News", "Network TV News", "IG", "FB"))
#Output Figure
base <- ggplot(df2, aes(x=df2_names, y=X2))
fig2 <- base + geom_pointrange(aes(ymin = X1, ymax = X3, y=X2)) +
coord_flip() +
theme_bw() +
theme(panel.grid.major.x = element_blank(), panel.grid.minor = element_blank(), plot.margin = margin(2, 2, 2, 2, "cm")) +
geom_hline(yintercept = 0, color = "red", size=1)
我正在努力的是减少y轴标签之间的空间,并创建断点。 ggplot2中的geom_pointrange是正确的方法,还是我应该检查的替代方法?
答案 0 :(得分:1)
获得明显分组的一种相对简单的方法是使用偷偷摸摸的刻面-也就是说,看起来不像刻面的刻面。这样也可以完全控制分组。
groups <- rev(c("Youtube", "Online News", "Friends and Family", "Radio", "Print Newspapers",
rep("TV", 3), "Social Media", "Social Media"))
df2$Category <- factor(groups, levels = unique(groups))
base <- ggplot(df2, aes(x=df2_names, y=X2))
base + geom_pointrange(aes(ymin = X1, ymax = X3, y=X2)) +
coord_flip() +
geom_hline(yintercept = 0, color = "red", size=1) +
facet_grid(Category~., scales = "free_y") +
theme_classic() +
theme(panel.spacing = unit(0, "points"),
strip.background = element_blank(),
strip.text = element_blank(),
plot.margin = margin(2, 2, 2, 2, "cm"),
panel.background = element_rect(linetype = 2, colour = "gray75", fill = NA),
axis.line.y.right = element_line(colour = "black"))
另一种方法是在需要中断的地方插入空白因子水平:
df2 <- rbind(df2, `colnames<-`(matrix(NA, ncol = 3, nrow = 2), c("X1", "X2", "X3")))
rownames(df2)[11:12] <- c(" ", " ")
df2_names <- factor(row.names(df2),
levels = c("YouTube", "Online News", "Friends and Family", "Radio", " ",
"Cable News", "Local TV News", "Network TV News", " ", "IG", "FB"))
base <- ggplot(df2, aes(x=df2_names, y=X2))
base + geom_pointrange(aes(ymin = X1, ymax = X3, y=X2)) +
coord_flip() +
geom_hline(yintercept = 0, color = "red", size=1) +
geom_vline(xintercept = " ", linetype = 2, color = "gray75") +
geom_vline(xintercept = " ", linetype = 2, color = "gray75") +
theme_classic()