- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 ggplot 在时间序列中绘制多条趋势线(每十年)。
这是数据:
dat <- structure(list(YY = 1961:2010, a = c(98L, 76L, 83L, 89L, 120L,
107L, 83L, 83L, 92L, 104L, 98L, 91L, 81L, 69L, 86L, 76L, 85L,
86L, 70L, 81L, 77L, 89L, 60L, 80L, 94L, 66L, 77L, 85L, 77L, 80L,
79L, 79L, 65L, 70L, 80L, 87L, 84L, 67L, 106L, 129L, 95L, 79L,
67L, 105L, 118L, 85L, 86L, 103L, 97L, 106L)), .Names = c("YY",
"a"), row.names = c(NA, -50L), class = "data.frame")
这是脚本:
p <- ggplot(dat, aes(x = YY))
p <- p + geom_line(aes(y=a),colour="blue",lwd=1)
p <- p + geom_point(aes(y=a),colour="blue",size=2)
p <- p + theme(panel.background=element_rect(fill="white"),
plot.margin = unit(c(0.5,0.5,0.5,0.5),"cm"),
panel.border=element_rect(colour="black",fill=NA,size=1),
axis.line.x=element_line(colour="black"),
axis.line.y=element_line(colour="black"),
axis.text=element_text(size=15,colour="black",family="serif"),
axis.title=element_text(size=15,colour="black",family="serif"),
legend.position = "top")
p <- p + scale_x_discrete(limits = c(seq(1961,2010,5)),expand=c(0,0))
p <- p + geom_smooth(data=dat[1:10,],aes(x=YY,y=a),method="lm",se=FALSE,color="black",formula=y~x,linetype="dashed")
p <- p + geom_smooth(data=dat[11:20,],aes(x=YY,y=a),method="lm",se=FALSE,color="black",formula=y~x,linetype="dashed")
p <- p + geom_smooth(data=dat[21:30,],aes(x=YY,y=a),method="lm",se=FALSE,color="black",formula=y~x,linetype="dashed")
p <- p + geom_smooth(data=dat[31:40,],aes(x=YY,y=a),method="lm",se=FALSE,color="black",formula=y~x,linetype="dashed")
p <- p + geom_smooth(data=dat[41:50,],aes(x=YY,y=a),method="lm",se=FALSE,color="black",formula=y~x,linetype="dashed")
p <- p + labs(x="Year",y="Number of Days")
outImg <- paste0("test",".png")
ggsave(outImg,p,width=8,height=5)
这是生成的图像:
我想要什么/问题
我想提取斜率并将它们添加到图中的趋势线上。如何从 geom_smooth() 中提取每条线的斜率?
目前,我正在一条一条地绘制趋势线。我想知道是否有一种有效的方法可以通过可调整的时间窗口来做到这一点。举例来说,假设我想每 5 年绘制一次趋势线。上图中时间窗口为10。
假设,我只想绘制显着趋势线(即 p 值 < 0.05,null:无趋势或斜率等于 0),是否可以使用 geom_smooth() 来实现?
我将不胜感激任何帮助。
最佳答案
因此,在将数据传输到 ggplot2 之前,最好先处理这些任务,但使用 tidyverse 中的其他一些包可以使这些任务变得相当容易。
从问题 1 和 2 开始:
虽然 ggplot2 可以绘制回归线,但要提取估计的斜率系数,您需要显式使用 lm()
对象。使用 group_by()
和 mutate()
,您可以添加一个分组变量(我下面的代码仅针对 5 年组进行此操作),然后计算并提取将斜率估计到现有数据框中的列中。然后,可以使用 geom_text() 调用在 ggplot 中绘制这些斜率估计值。我在下面以一种快速而肮脏的方式完成了此操作(将每个标签放置在它们回归的 x 和 y 值的平均值处),但您可以指定它们在数据框中的确切位置。
对变量进行分组和数据准备也使问题 2 变得轻而易举:既然您已经在数据框中显式地分组了变量,则无需一一绘制,geom_smooth()
接受 群体
审美。
此外,要回答问题 3,您可以从 lm 对象的摘要中提取 pvalue,并仅过滤掉那些对您关心的级别重要的值。如果您将这个完整的数据帧传递给 geom_smooth()
和 geom_text()
,您将获得您正在寻找的绘图!
library(tidyverse)
# set up our base plot
p <- ggplot(dat, aes(x = YY, y = a)) +
geom_line(colour = "blue", lwd = 1) +
geom_point(colour = "blue", size = 2) +
theme(
panel.background = element_rect(fill = "white"),
plot.margin = unit(c(0.5, 0.5, 0.5, 0.5), "cm"),
panel.border = element_rect(colour = "black", fill = NA, size = 1),
axis.line.x = element_line(colour = "black"),
axis.line.y = element_line(colour = "black"),
axis.text = element_text(size = 15, colour = "black", family = "serif"),
axis.title = element_text(size = 15, colour = "black", family = "serif"),
legend.position = "top"
) +
scale_x_discrete(limits = c(seq(1961, 2010, 5)), expand = c(0, 0))
# add a grouping variable (or many!)
prep5 <- dat %>%
mutate(group5 = rep(1:10, each = 5)) %>%
group_by(group5) %>%
mutate(
slope = round(lm(YY ~ a)$coefficients[2], 2),
significance = summary(lm(YY ~ a))$coefficients[2, 4],
x = mean(YY), # x coordinate for slope label
y = mean(a) # y coordinate for slope label
) %>%
filter(significance < .2) # only keep those with a pvalue < .2
p + geom_smooth(
data = prep5, aes(x = YY, y = a, group = group5), # grouping variable does the plots for us!
method = "lm", se = FALSE, color = "black",
formula = y ~ x, linetype = "dashed"
) +
geom_text(
data = prep5, aes(x = x, y = y, label = slope),
nudge_y = 12, nudge_x = -1
)
现在,您在指定文本标签的位置时可能需要比我在这里更加小心。我使用了means和geom_text()
的nudge_*
参数做了一个简单的例子,但请记住,因为这些值被显式映射到x和y坐标,所以你已经完成了控制!
由reprexpackage于2018年7月16日创建(v0.2.0)。
关于r - 从 geom_smooth() 中提取多条趋势线的斜率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51355303/
出于某种原因,在我的图表中,geom_smooth 线的颜色与阴影区域不同。我不确定是什么原因造成的。例如,蓝色阴影的 Retired 有一条绿线,而绿色阴影的 Unsigned 有一条蓝线。事件状态
我有以下 ggplot2 代码,可以绘制不同阶数的多个多项式拟合: library(ggplot2) set.seed(1234) n = 400 x = rnorm(n, sd=0.4) y = -
如何制作 ggplot 图 geom_smooth(method="lm"),但前提是它符合某些标准?例如,如果我只想在斜率具有统计显着性的情况下画线(即 lm 拟合中的 p 小于 0.01)。 编辑
我在 R 中计算了二项式回归: Call: glm(formula = cbind(success, failure) ~ x * f, family = "binomial", data =
这是一些数据和情节: set.seed(18) data = data.frame(y=c(rep(0:1,3),rnorm(18,mean=0.5,sd=0.1)),colour=rep(1:2,1
我正在使用 ggplot2 中的 geom_smooth()。 在 Hadley Wickham 的书(“ggplot2 - Elegant Graphics for Data Analysis”)中
您可以非常轻松地在 ggplot2 中扩展回归线: c =init_range[1]] ggplot2:::predictdf.default(model, xseq[-length(xseq
在查看this时问题,我无法为 geom_smooth 指定自定义线性模型。我的代码如下: example.label <- c("A","A","A","A","A","B","B","B","B"
我正在努力使用 geom_smooth 来创建几何平滑线。下面我报告代码: library(ggplot2) #DATAFRAME RawData <- data.frame("Time" = c(0
是否可以让geom_smooth产生单调递减函数? 第一个例子看起来是单调递减的: library(tidyverse) df <- structure(list(x = c(-55, 11, 19,
这个问题在这里已经有了答案: ggplot - Add regression line on a boxplot with binned (non-continuous) x-axis (1 个回答)
我正在绘制一些数据并具有以下代码: ggplot(aes(x = x, y = y), data = data) + geom_point(alpha = 1/15, color = 'blue'
我想用ggplot2建立一个情节。因此,我使用geom_line来可视化线,并使用geom_smooth来显示特定索引的最小-最大范围。 使用了两个数据框,第一行包含日期(例如:2013-02-04)
如果我添加 geom_smooth,那么我会在 shape 图例中得到不同颜色的矩形,而不是黑色圆圈。我怎样才能防止这种情况发生?这是 sample code . library(ggplot2) d
我正在寻找两个变量之间的比较图,重叠两个产品的 geom_smooth()。测量力理论的起点是 (x=0; y=0) 但是当我制作图表时,蓝色回归线是用 geom_smooth() 不传递坐标 (0;
如何在 geom_smooth() 中改变线条边框的颜色? library(ggplot2) mtcars$cyl <- as.factor(mtcars$cyl) ggplot(mtcars, ae
我有如下数据: library(quantreg) library(ggplot2) data <- structure(list(country_mean_rep = structure(c(73.
这个问题在这里已经有了答案: R stat_smooth all points (1 个回答) 关闭4年前。 我正在绘制一个包含 3 个不同类别的图表,这些类别由不同的颜色表示。我想要一条曲线来表示总
我有一个小问题,我自己无法解决这个问题。 我有一个简单的数据框,我想用 ggplot2 绘制它.当我使用变量 重量 作为一个因素,我得到 x 轴上的所有值,s。 plot 2,但当我将它用作整数时,s
使用以下代码: library(ggplot2) ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes(colour=factor(cyl)))
我是一名优秀的程序员,十分优秀!