【问题标题】:R add tweaks to interaction plot with ggplotR 使用 ggplot 对交互图进行调整
【发布时间】:2020-06-20 18:42:59
【问题描述】:

我想修改这个图表:

  • 缩短线以仅显示从 -1 SD 到 + 1SD 的权重变量
  • 用正方形或三角形符号为每条线加盖
  • 更改 x 轴以显示低重量和高重量,而不是数字和刻度线。
library(tidyverse)
dat=mtcars
mod <- lm(mpg ~ gear * wt, data=dat)

apatheme=theme_bw()+
  theme(panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        panel.border=element_blank(),
        axis.line=element_line(),
        text=element_text(family='Times'),
        legend.title=element_blank())

p=ggplot(dat, aes(x = wt, y = mpg, size = gear))+
  geom_blank()+
  labs(x = 'Vehicle Weight', y = 'Vehicle MPG')+
  scale_size_continuous(guide = FALSE)+
  geom_abline(aes(intercept=33.965, slope=-4.3985, linetype='-1SD Gear'))+
  geom_abline(aes(intercept=42.2767, slope=-7.3095, linetype='+1SD Gear'))+
  scale_linetype_manual(values=c('dotted','dashed','solid'),
                        breaks=c('-1SD Gear','Mean Gear','+1SD Gear'),name='Simple\nSlope')+
  apatheme
p

这是它目前生产的产品

我正在努力让它更接近这个 APA 风格的版本

【问题讨论】:

  • 你试过geom_segment而不是geom_abline吗?
  • 不!谢谢指点。

标签: r ggplot2


【解决方案1】:

由于您想根据与均值的 SD 差异进行绘图,因此首先要计算您感兴趣的变量的均值和 SD。然后,您可以构建一个数据框,其中包含您想要为 gearwt 的特定值包含的点。

使用您的模型modmpgpredict 值将基于 gearwt,而不是使用数字来表示斜率/截距。

我根据您想要的数字添加了一些因素/标签。

library(tidyverse)
library(ggplot2)

dat=mtcars
mod <- lm(mpg ~ gear * wt, data=dat)

dat_sum <- do.call(data.frame, aggregate(. ~ 1, dat, function(x) c(mean = mean(x), sd = sd(x))))

df <- data.frame(
  gear = with(dat_sum, c(gear.mean - gear.sd, gear.mean + gear.sd, gear.mean - gear.sd, gear.mean + gear.sd)),
  gear_lab = factor(c("Low Gears", "High Gears", "Low Gears", "High Gears"), levels = c("Low Gears", "High Gears")),
  wt = with(dat_sum, c(wt.mean - wt.sd, wt.mean - wt.sd, wt.mean + wt_sd, wt.mean + wt.sd)),
  wt_lab = factor(c("Low Weight", "Low Weight", "High Weight", "High Weight"), levels = c("Low Weight", "High Weight")))

df$mpg <- predict(mod, df)

apatheme=theme_bw()+
  theme(panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        panel.border=element_blank(),
        axis.line=element_line(),
        text=element_text(family='Times'),
        legend.title=element_blank())

ggplot(df, aes(x = wt_lab, y = mpg, group = gear_lab))+
  geom_point(aes(shape = gear_lab))+
  geom_line(aes(linetype = gear_lab))+
  ylim(0,30)+
  labs(x = 'Vehicle Weight', y = 'Vehicle MPG')+
  scale_shape_manual(values = c(15, 17))+
  scale_linetype_manual(values = c('dotted', 'dashed'))+
  apatheme

情节

【讨论】:

  • 感谢发帖。我试图让它在我的 RStudio 中运行。你能解释一下这一行吗:dat_sum
  • @KevinT 有不同的方法可以获得不同变量的均值和标准差,我选择了aggregate,尽管其他方法也可以。尝试一些简单的aggregate 语句来熟悉它。例如,从iris 数据集中,您可以执行:aggregate(Sepal.Length ~ Species, data = iris, mean),这将通过Species(3 个物种的 3 个平均值)计算 mean Sepal.Length。如果您在公式中使用.(点)而不是Sepal.Length,它将返回数据集中所有变量的平均值(Sepal.Width、Petal.Length、Petal.Width 等)...
  • . ~ 1 中的 aggregate 根本没有进一步子集化。它只会计算整体的平均值(以及上例中的标准差),而不是按子组计算。就是这样。
  • 好的,这很有道理。所以,我实际上当然是在尝试绘制比我在 reprex 中使用的 mt_cars 示例更复杂的东西。我正在尝试绘制交互图,而我的模型要复杂得多。我认为除了预测功能外,我可以正常工作。您对我如何使用此模型调用预测函数有任何指导:
  • 我能够让它与我更复杂的交互模型一起工作。感谢您提供解决方案!
猜你喜欢
  • 1970-01-01
  • 2021-05-07
  • 2023-03-15
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2014-04-05
相关资源
最近更新 更多