ggplot2 中的回归线
Regression line in ggplot2
我正在尝试使用 ggplot 在下图中添加回归线,但它一直给我模糊的错误。我是新手,none 关于这个主题的其他问题解决了我的问题,所以请不要对已经回答的类似问题生气。
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)
(但我的情节没有出现...)
这是一个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
第一个选项
继续使用函数 table
。在绘制图表之前,我们使用 type.convert
将变量 parent 和 child 转换为它们适当的类型。
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
我正在尝试使用 ggplot 在下图中添加回归线,但它一直给我模糊的错误。我是新手,none 关于这个主题的其他问题解决了我的问题,所以请不要对已经回答的类似问题生气。
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)
(但我的情节没有出现...)
这是一个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
第一个选项
继续使用函数 table
。在绘制图表之前,我们使用 type.convert
将变量 parent 和 child 转换为它们适当的类型。
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