Created
July 28, 2018 12:25
-
-
Save wpetry/b133f67e859d5f44f5b2388191e22362 to your computer and use it in GitHub Desktop.
plot histogram of wind speed and direction on polar coordinates
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# WindRose.R | |
# modified from https://stackoverflow.com/questions/17266780/wind-rose-with-ggplot-r | |
require(ggplot2) | |
require(RColorBrewer) | |
require(dplyr) | |
require(tidyr) | |
plot.windrose <- function(data, | |
spd, | |
dir, | |
spdres = 2L, | |
dirres = 30L, | |
spdmin = 2L, | |
spdmax = 20L, | |
spdseq = NULL, | |
palette = "YlGnBu", | |
countmax = NA, | |
debug = 0){ | |
# Look to see what data was passed in to the function | |
if (is.numeric(spd) & is.numeric(dir)){ | |
# assume that we've been given vectors of the speed and direction vectors | |
data <- data.frame(spd = spd, | |
dir = dir) | |
spd = "spd" | |
dir = "dir" | |
} else if (exists("data")){ | |
# Assume that we've been given a data frame, and the name of the speed | |
# and direction columns. This is the format we want for later use. | |
} | |
# Tidy up input data ---- | |
n.in <- NROW(data) | |
dnu <- (is.na(data[[spd]]) | is.na(data[[dir]])) | |
data[[spd]][dnu] <- NA | |
data[[dir]][dnu] <- NA | |
# figure out the wind speed bins ---- | |
if (missing(spdseq)){ | |
spdseq <- seq(spdmin,spdmax,spdres) | |
} else { | |
if (debug >0){ | |
cat("Using custom speed bins \n") | |
} | |
} | |
# get some information about the number of bins, etc. | |
n.spd.seq <- length(spdseq) | |
n.colors.in.range <- n.spd.seq - 1 | |
# create the color map | |
spd.colors <- colorRampPalette(brewer.pal(min(max(3, | |
n.colors.in.range), | |
min(9, | |
n.colors.in.range)), | |
palette))(n.colors.in.range) | |
if (max(data[[spd]],na.rm = TRUE) > spdmax){ | |
spd.breaks <- c(spdseq, | |
max(data[[spd]],na.rm = TRUE)) | |
spd.labels <- c(paste(c(spdseq[1:n.spd.seq-1]), | |
'-', | |
c(spdseq[2:n.spd.seq])), | |
paste(spdmax, | |
"-", | |
max(data[[spd]],na.rm = TRUE))) | |
spd.colors <- c(spd.colors, "grey50") | |
} else{ | |
spd.breaks <- spdseq | |
spd.labels <- paste(c(spdseq[1:n.spd.seq-1]), | |
'-', | |
c(spdseq[2:n.spd.seq])) | |
} | |
data$spd.binned <- cut(x = data[[spd]], | |
breaks = spd.breaks, | |
labels = spd.labels, | |
include.lowest = FALSE, | |
ordered_result = TRUE) | |
# clean up the data | |
data <- data %>% | |
drop_na_(vars = c(spd, dir)) %>% | |
drop_na(spd.binned) | |
# figure out the wind direction bins | |
dir.breaks <- c(-dirres/2, | |
seq(dirres/2, 360-dirres/2, by = dirres), | |
360+dirres/2) | |
dir.labels <- c(paste(360-dirres/2,"-",dirres/2), | |
paste(seq(dirres/2, 360-3*dirres/2, by = dirres), | |
"-", | |
seq(3*dirres/2, 360-dirres/2, by = dirres)), | |
paste(360-dirres/2,"-",dirres/2)) | |
# assign each wind direction to a bin | |
dir.binned <- cut(data[[dir]], | |
breaks = dir.breaks, | |
ordered_result = TRUE) | |
levels(dir.binned) <- dir.labels | |
data$dir.binned <- dir.binned | |
# Run debug if required ---- | |
if (debug>0){ | |
cat(dir.breaks,"\n") | |
cat(dir.labels,"\n") | |
cat(levels(dir.binned),"\n") | |
} | |
# deal with change in ordering introduced somewhere around version 2.2 | |
if(packageVersion("ggplot2") > "2.2"){ | |
data$spd.binned = with(data, factor(spd.binned, levels = rev(levels(spd.binned)))) | |
spd.colors = rev(spd.colors) | |
} | |
# create the plot ---- | |
p.windrose <- ggplot(data = data, | |
aes(x = dir.binned, | |
fill = spd.binned)) + | |
geom_bar() + | |
scale_x_discrete(drop = FALSE, | |
labels = waiver()) + | |
coord_polar(start = -((dirres/2)/360) * 2*pi) + | |
scale_fill_manual(name = "Wind Speed (m/s)", | |
values = spd.colors, | |
drop = FALSE) + | |
theme(axis.title.x = element_blank()) | |
# adjust axes if required | |
if (!is.na(countmax)){ | |
p.windrose <- p.windrose + | |
ylim(c(0,countmax)) | |
} | |
# print the plot | |
print(p.windrose) | |
# return the handle to the wind rose | |
return(p.windrose) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment