我想用ggplot2
复制下图(虽然更大,但我不知道为什么这个数字如此之小)。
(这项研究的主题是穆斯林少数民族青年的融合。)
我用Stata中的包-coefplot-开发了上面的原始图,现在尝试在R中使用相同的颜色。
在R和ggplot2
中,我从使用MplusAutomation
获得的两个简单数据帧开始(来自Mplus应用程序中的估计)。可以使用以下代码重现数据帧:
resModel1 <-
structure(list(param = c("FEMALE", "CHRISTIAN", "MUSLIM"),
low2.5 = c(-0.436, 0.038, 0.19),
est = c(-0.271, 0.18, 0.354), up2.5 = c(-0.106, 0.323, 0.519)),
.Names = c("param", "low2.5", "est", "up2.5"), row.names = 7:9,
class = c("data.frame", "mplus.params"))
resModel2 <-
structure(list(param = c("FEMALE", "CHRISTIAN", "MUSLIM", "CHRISTGI", "MUSLIMGI"),
low2.5 = c(-0.672, -0.256, -0.018, 0.131, -0.143),
est = c(-0.437, -0.038, 0.237, 0.403, 0.237), up2.5 = c(-0.203, 0.18, 0.493, 0.675, 0.617)), .Names = c("param", "low2.5", "est", "up2.5"),
row.names = 7:11, class = c("data.frame", "mplus.params"))
然后我尝试使用ggplot2
开发两个图并将它们与gridExtra
结合使用:
library(ggplot2)
limits <- aes(ymax = up2.5, ymin = low2.5)
plot1 <- ggplot(resModel1, aes(x=param, y=est)) +
geom_pointrange(limits, color = "darkblue") +
scale_x_discrete("") +
geom_hline(yintercept=0, color="red") +
theme_bw() +
theme(text = element_text(size=10)) +
ylab(NULL) +
coord_flip()
plot2 <- ggplot(resModel2, aes(x=param, y=est)) +
geom_pointrange(limits, color="darkblue") +
scale_x_discrete("") +
geom_hline(yintercept=0, color="red") +
theme_bw() +
theme(text = element_text(size=10)) +
ylab(NULL) +
coord_flip()
library(gridExtra)
grid.arrange(plot1, plot2, ncol=2)
......最后得到以下情节:
我希望做到以下几点:
在搜索解决方案时,我找到了一个名为coefplot
的R包(ggplot2
的一种附加组件),但我不确定coefplot
是否可以开发情节我我想在ggplot2
中自行编写代码以获得灵活性。
我还找到了sjp.glm
(https://strengejacke.wordpress.com/2013/03/22/plotting-lm-and-glm-models-with-ggplot-rstats/),但是当我在R外估计统计模型并且需要绘制数据框中可用的参数时,我无法看到该函数如何帮助我。
答案 0 :(得分:4)
至少让你开始,修复第1,2,3和5点。第4点是不可取的,只是编辑你的data.frame要容易得多,不要对你自己施加人为限制。
df <- rbind(resModel1, resModel2)
df$model <- rep(c('Model 1', 'Model 2'), c(nrow(resModel1), nrow(resModel2)))
df$param_f <- factor(df$param,
rev(c('CHRISTIAN', 'MUSLIM', 'FEMALE', 'CHRISTGI', 'MUSLIMGI')),
rev(c('Christian', 'Muslum', 'Female', 'Christian girls', 'Muslim girls')))
ggplot(df, aes(x = param_f, y = est)) +
geom_pointrange(aes(ymax = up2.5, ymin = low2.5), color = "darkblue") +
geom_text(aes(label = est), nudge_x = 0.15) +
scale_x_discrete("") +
geom_hline(yintercept = 0, color = "red") +
theme_bw() +
theme(text = element_text(size=10)) +
ylab(NULL) +
coord_flip() +
facet_grid(~model)