【问题标题】:ggplot + smooth line with varying thicknessggplot + 不同粗细的平滑线
【发布时间】:2015-06-05 15:56:39
【问题描述】:

我想创建一个线宽取决于变量值的折线图。这很简单;在这方面引发扳手的是我希望这条线平滑。任何建议如何将不断变化的大小变量提供给“stat_smooth”?

数据:

set.seed(1234)
library(ggplot2);library(splines)

data <- data.frame(
    date = seq(as.Date('2014-05-01'), length = 31, by = '1 day'),
    orders = sample(50:100, 31, replace=TRUE),
    revenue = sample(1500:3000, 31, replace=TRUE))

如果我只是使用标准的 ggplot 折线图来绘制随时间变化的订单,很容易让粗细随“收入”而变化:

plot <- ggplot(data, aes(x=date, y=orders))
plot + geom_line(aes(size=revenue))

但我想平滑线条。我一直在使用的方法使用“stat_smooth”(如果有更好的方法,请告诉我)。问题是这不允许改变线宽参数。

平滑线图如下所示:

plot + stat_smooth(method="lm", formula=y~ns(x,15), se=FALSE)

如果我尝试为大小添加一个变量取决于收入,它没有任何效果:

plot + stat_smooth(method="lm", formula=y~ns(x,15), se=FALSE, aes(size=data$revenue))

是否可以根据变量值来改变平滑线的粗细?

【问题讨论】:

  • 突然想到:在 ggplot 之外拟合模型,将拟合值拉入常规 geom_line 层。
  • @joran,你能补充一点关于你将如何做到这一点的细节吗?
  • stat_smooth 只是将lm 与您提供的公式相匹配。分别执行此操作,并使用predict 将预测值存储在单独的数据帧中,然后将该数据帧传递给geom_line 层。
  • 明白了。不幸的是,这条线并不像我希望的那样平滑: mod1
  • ...所以以更精细的规模调用 predict ,并以更精细的规模提供 x 值。

标签: r ggplot2


【解决方案1】:

这很丑陋,但似乎有效。基本思想与上面建议的相同:使用predict() 更精细的分辨率。

#fit model
mod1<-lm(orders~ns(date,15), data=data)

#predict 500 values
N<-500
newdata <- data.frame(
    date=c(data$date, seq(min(data$date), max(data$date), length.out=N)),
    revenue = c(data$revenue, rep(NA, N))
)
newdata$pred <- predict(mod1, newdata)
newdata <- newdata[order(newdata$date),]
#carry revenue values forward
newdata$revenue <- zoo::na.locf.default(newdata$revenue)
change<-c(TRUE,diff(newdata$revenue)!=0)
newdata$grp<-cumsum(change)
#add rows to help join the segments
newdata<-rbind(newdata, cbind(pred=newdata[which(change)[-1],c("pred")], newdata[which(change)-1,c("date","revenue","grp")]))

然后绘制

ggplot(newdata, aes(x=date, y=pred, group=grp, size=revenue)) + geom_line()

得到

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多