在 geom-smooth / ggplot2 / R 中自定义公式

Customize formula in geom-smooth / ggplot2 / R

我想像这样自定义 geom_smooth 中使用的公式:

library(MASS)
library(ggplot2)

data("Cars93", package = "MASS")

str(Cars93)

Cars93.log <- transform(Cars93, log.price = log(Price))

log.model <- lm(log.price ~ Horsepower*Origin, data = Cars93.log)
summary(log.model)
plot(log.model)

p <- ggplot(data = Cars93.log, aes(x = Horsepower, y = log.price, colour = Origin)) + 
  geom_point(aes(shape = Origin, color = Origin)) +   # Punkte
  facet_grid(~ Origin) +
  theme(axis.title.x = element_text(margin=margin(15,0,0,0)),
        axis.title.y = element_text(margin=margin(0,15,0,0))) +
  scale_y_continuous(n.breaks = 7) +
  scale_colour_manual(values = c("USA" = "red","non-USA" = "black")) +
  scale_shape_manual(values = c(16,16)) +
  ylab("Price(log)")

lm.mod <- function(df) {
  y ~ x*Cars93.log$Origin
}

p_smooth <- by(Cars93.log, Cars93.log$Origin, 
               function(x) geom_smooth(data=x, method = lm, formula = lm.mod(x)))

p + p_smooth

但是,由于我使用的变量长度不同,我收到计算失败的错误消息。

length(Cars93.log$log.price)
length(Cars93.log$Origin)
length(Cars93.log$Horsepower)

但是当我检查每个变量的长度时,它们都是相同的...任何想法,有什么问题吗?

非常感谢,玛蒂娜

我同意@Ru​​i Barradas,问题似乎出在 lm.modp_smooth 的行以及 by 函数

一旦您通过来源进行区分(例如,通过执行 facet_wrapcolor = Origin),那么 geom_smooth 将自动为这些方面 运行 不同的模型。

p <- ggplot(data = Cars93.log, 
            aes(x = Horsepower, y = log.price, color = Origin)) + 
  geom_point(aes(shape = Origin)) +
  facet_wrap(~ Origin) +
  theme(axis.title.x = element_text(margin=margin(15,0,0,0)),
        axis.title.y = element_text(margin=margin(0,15,0,0))) +
  scale_y_continuous(n.breaks = 7) +
  scale_colour_manual(values = c("USA" = "red","non-USA" = "black")) +
  scale_shape_manual(values = c(16,16)) +
  ylab("Price(log)")

p + geom_smooth(method = lm, formula = y ~ x)

你可以说服自己这与 log.model 的输出相同,方法是扩展 x 轴限制以查看 geom_smooth 线与 y 轴的交叉点(例如, + coord_cartesian(xlim = c(0, 300)))

如果您不将 color = Origin 传递给 geom_smooth 函数,您还可以看到图表中的差异(如果您从第一个 ggplot() 初始化中注释掉它,基本上会发生什么):

p <- ggplot(data = Cars93.log, 
            aes(x = Horsepower, y = log.price)) + # color = Origin)) + 
  geom_point(aes(shape = Origin)) +
  #facet_wrap(~ Origin) +
  theme(axis.title.x = element_text(margin=margin(15,0,0,0)),
        axis.title.y = element_text(margin=margin(0,15,0,0))) +
  scale_y_continuous(n.breaks = 7) +
  scale_colour_manual(values = c("USA" = "red","non-USA" = "black")) +
  scale_shape_manual(values = c(16,16)) +
  ylab("Price(log)")

p + geom_smooth(method = lm, formula = y ~ x)