The plot that you show above does not give the right directions - for example. dat$wd[1] is around 190 Β°, so if 0 Β° corresponds to a horizontal right arrow, 190 Β° should give you an arrow pointing left and slightly down.
To get the arrows in the right direction, you need to add the cosine and sine of the wind direction to the start point of the arrow to determine its end point (see code below). The difficult problem here is scaling the arrows in the x and y direction, because (1) these axes are on completely different scales, so the βlengthβ of the arrow cannot mean anything and (2) the aspect ratio of your plotter will distort the visual lengths of the arrows.
I placed the solution sketch below, where I scale the arrow offset in the x and y direction by 10% of the range of variables used to plot the graph, but this does not give vectors of uniform visual length. In any case, the length of these arrows is not well defined, because, again, (a) the x and y axes represent different units and (b) changing the aspect ratio of the graph will change the length of these arrows.
## arrows go from (datetime, pollutant) to ## (datetime, pollutant) + scaling*(sin(wd), cos(wd)) scaling <- c(as.numeric(diff(range(dat$datetime)))*60*60, # convert to seconds diff(range(dat$pollutant)))/10 dat <- within(dat, { x.end <- datetime + scaling[1] * cos(wd / 180 * pi) y.end <- pollutant + scaling[2] * sin(wd / 180 * pi) }) ggplot(data = dat, aes(x = datetime, y = pollutant)) + geom_line() + geom_segment(data = dat, size = 1, aes(x = datetime, xend = x.end, y = pollutant, yend = y.end, colour=ws), arrow = arrow(length = unit(0.1, "cm"))) + scale_colour_gradient(low="green", high="red")

And the change in aspect ratio: 
source share