我想创建一个折线,其宽度取决于变量值。这很简单;在这里抛出一把扳手的是我希望线条平滑。有关如何将更改大小变量提供给" 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))
但我想平滑线条。我一直在使用的方法利用&#34; stat_smooth&#34; (如果有更好的方法,请告诉我)。问题是,这不允许变化的线厚度参数。
以下是平滑线图表的外观:
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))
是否可以根据变量值进行平滑的线厚度变化?
答案 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()
获取