【问题标题】:Regression line in ggplot2ggplot2中的回归线
【发布时间】:2015-11-09 11:06:53
【问题描述】:

我正在尝试使用 ggplot 在下图中添加一条回归线,但它一直给我带来模糊的错误。我是新手,关于这个主题的其他问题都没有解决我的问题,所以请不要因为已经回答的类似问题而生气。

library(UsingR,ggplot2); data(galton)  
y <- galton$child  
x <- galton$parent  
freqData <- as.data.frame(table(galton$child, galton$parent))  
names(freqData) <- c("child", "parent", "freq")  
regression <- coef(lm(y~x))  

freqData <- freqData[freqData$freq > 0,]  

g <- ggplot(data=freqData, aes(x = parent, y = child))  
g <- g + scale_size(range = c(2,20), guide = 'none')  
g <- g + geom_point(colour="grey50", aes(size=freq+20,show_guide=FALSE))  
g <- g + geom_point(aes(colour=freq,size=freq))  
g <- g + scale_colour_gradient(low="lightblue",high="darkblue")  

我尝试了以下命令:

g <- g + geom_smooth(method="lm",se=FALSE)

(它会产生这个错误:geom_smooth: Only one unique x value each group.Maybe you want aes(group = 1)?

g <- g + geom_abline(intercept = 28.942, slope = 0.646,colour = "red",size = 3)

(但我的情节上什么都没有出现......)

【问题讨论】:

  • 在创建freqData的过程中,你的'child'和'parent'变量已经变成了因子。 (您可以通过 str(freqData) 进行检查。两种解决方案:转换为数字,或使用 split/apply 或 data.table 或 dplyr 方法来生成 freqData,该方法首先不会将您的数字变量转换为因子。跨度>
  • 你不打算把它写成一个解决方案并附上一个情节。这是一个看起来很酷的情节。

标签: r ggplot2 regression


【解决方案1】:

这是一个 data.table 解决方案(由@MikeWise 提示撰写,以展示您设计的酷情节)

library(UsingR,ggplot2); data(galton)  
library(data.table)

#making data.table object
dat <- galton
setDT(dat)

#getting frequencies    
freqData <- dat[,.(freq=.N),by=.(child,parent)]


g <- ggplot(data=freqData, aes(x = parent, y = child))  
g <- g + scale_size(range = c(2,20), guide = 'none')  
g <- g + geom_point(colour="grey50", aes(size=freq+20,show_guide=FALSE))  
g <- g + geom_point(aes(colour=freq,size=freq))  
g <- g + scale_colour_gradient(low="lightblue",high="darkblue")  
g <- g + geom_smooth(method="lm",se=FALSE)
g

【讨论】:

  • 您也可以只使用dat[, .N, by=.(child, parent)]。这将创建一个频率列N
  • 我知道,我采用这种方法来匹配 OPs 列名。
  • 谢谢,非常感谢您的帮助!
【解决方案2】:

第一个选项

继续使用函数table。在绘制图表之前,我们使用type.convert 将变量父和子转换为其适当的类型。

library(UsingR,ggplot2); data(galton)

# Create data frame
freqData <- data.frame(table(galton$child, galton$parent))
names(freqData) <- c("child", "parent", "freq")  
freqData <- freqData[freqData$freq > 0,] 

# Convert factors to numeric
freqData[] <- lapply(freqData, function(x) type.convert(as.character(x)))

第二个选项

使用函数aggregate,防止类型转换。

freqData <- aggregate(galton, by = list(parent = galton$parent, child = galton$child), 
                      FUN = length)
colnames(freqData)[3] <- "freq" 

第三个选项

使用dplyr 避免类型转换。

library(dplyr)
freqData <- galton  %>%  group_by(parent, child) %>% summarise(freq = n())

绘制先前由三个选项之一创建的数据框。

# Plot data
g <- ggplot(data=freqData, aes(x = parent, y = child))+ 
  scale_size(range = c(2,20), guide = 'none')  +
  geom_point(colour="grey50", aes(size=freq+20,show_guide=FALSE)) +
  geom_point(aes(colour=freq,size=freq)) +
  scale_colour_gradient(low="lightblue",high="darkblue") +
  geom_smooth(method = lm, se = FALSE)
g

【讨论】:

  • 谢谢,非常感谢您的帮助!
  • 不错的解决方案。但恕我直言,总的来说,首先防止这些类型转换发生通常比在“下游”修复它们更容易。
  • @Heroka 我同意你的看法。我扩展了我的答案,包括处理避免类型转换的问题的其他两个选项。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-11-07
  • 2020-01-12
  • 2015-01-02
  • 2021-03-14
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多