ggplot +不同厚度的光滑线条

时间:2015-06-05 15:56:40

标签: r ggplot2

我想创建一个折线,其宽度取决于变量值。这很简单;在这里抛出一把扳手的是我希望线条平滑。有关如何将更改大小变量提供给" stat_smooth&#34 ;?的任何建议

数据:

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折线图来绘制一段时间内的订单,那么厚度就会变得很容易,因为&#34;收入&#34;:

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

enter image description here 但我想平滑线条。我一直在使用的方法利用&#34; stat_smooth&#34; (如果有更好的方法,请告诉我)。问题是,这不允许变化的线厚度参数。

以下是平滑线图表的外观:

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

enter image description here

如果我尝试根据收入添加大小的变量,则不会产生任何影响:

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

是否可以根据变量值进行平滑的线厚度变化?

1 个答案:

答案 0 :(得分: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()

获取

enter image description here