如何在R中重新创建此类图表? (绘制回归/治疗效果)

时间:2020-08-14 19:30:19

标签: r ggplot2

我一直在尝试重新创建与最初在Stata中创建的图表类似的图表(请参见下图)。

Original Chart in 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)

Attempted Chart in R

我正在努力的是减少y轴标签之间的空间,并创建断点。 ggplot2中的geom_pointrange是正确的方法,还是我应该检查的替代方法?

1 个答案:

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

enter image description here

另一种方法是在需要中断的地方插入空白因子水平:

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() 

enter image description here