如何绘制女性平均生育数年份趋势图?解决R语言趋势线与X轴问题
解决R语言时间趋势图的两个问题及通用绘制方法
一、给基础绘图添加趋势线
你用aggregate得到的mean_children_yearly是数据框,直接绘图后可通过拟合回归模型添加趋势线,代码示例如下:
# 计算年度平均生育数 mean_children_yearly <- aggregate(kids ~ year, fertility, FUN = mean) # 绘制基础折线图(加type="l"切换为折线,默认是散点) plot(kids ~ year, data = mean_children_yearly, xlim=c(2002,2014), ylim=range(mean_children_yearly$kids), type="l", col="blue", lwd=2) # 拟合线性回归模型 trend_model <- lm(kids ~ year, data = mean_children_yearly) # 添加红色线性趋势线 abline(trend_model, col="red", lwd=2)
如果需要平滑趋势线(非严格线性),可以用loess方法:
# 拟合平滑模型 smooth_model <- loess(kids ~ year, data = mean_children_yearly) # 生成年份序列对应的预测值 pred_smooth <- predict(smooth_model, newdata = data.frame(year=seq(2002,2014,1))) # 添加绿色平滑趋势线 lines(seq(2002,2014,1), pred_smooth, col="green", lwd=2, lty=2)
二、用ts函数绘图时显示年份
直接将数据框转为ts对象会把年份也纳入序列,正确做法是单独提取均值列,指定时间序列的起始年份和频率(年度数据frequency=1),再手动设置X轴刻度:
# 提取均值列生成ts对象,指定起始年份2002、年度数据 a <- ts(mean_children_yearly$kids, start=2002, frequency=1) # 绘图时先隐藏默认X轴 plot(a, xaxt="n", col="blue", lwd=2, main="年度平均生育数趋势", ylab="平均生育数") # 手动添加2002-2014年的刻度 axis(1, at=seq(2002,2014,1), labels=seq(2002,2014,1))
三、均值随年份变化的时间趋势图通用方法
方法1:基础R实现
- 数据聚合:按年份分组计算均值,两种常用方式:
# 用aggregate函数 yearly_mean <- aggregate(目标变量 ~ year, 数据集, FUN=mean) # 用dplyr包(需先加载) library(dplyr) yearly_mean <- 数据集 %>% group_by(year) %>% summarize(mean_value = mean(目标变量, na.rm=TRUE)) - 绘制趋势图:可选择散点、折线或两者结合:
plot(mean_value ~ year, data=yearly_mean, type="b", pch=16, col="darkblue", xlab="年份", ylab="均值", main="年度均值时间趋势") - 添加趋势线:线性趋势用
abline(lm(...)),平滑趋势用loess+lines(参考前文示例)。
方法2:ggplot2实现(灵活美观)
ggplot2处理时间趋势更直观,自带丰富美化选项:
library(ggplot2) # 确保年份为数值型(若为字符型需转换) yearly_mean$year <- as.numeric(yearly_mean$year) ggplot(yearly_mean, aes(x=year, y=mean_value)) + geom_line(color="darkblue", linewidth=1) + # 绘制折线 geom_point(color="red", size=2) + # 添加散点标记 geom_smooth(method="lm", color="green", se=FALSE) + # 线性趋势线,se=FALSE隐藏置信区间 # 若需平滑趋势,替换为:geom_smooth(method="loess", color="orange", se=FALSE) scale_x_continuous(breaks=seq(2002,2014,1)) + # 设置年份刻度间隔 labs(title="年度平均生育数时间趋势", x="年份", y="平均生育数") + theme_minimal() # 应用简洁主题
内容的提问来源于stack exchange,提问作者Somebody_Data_Science
相关产品推荐
相关产品推荐

