This is happening because the variable you are using to order your data is a character variable and not a numeric variable, so all values starting with 1 come before those starting with 2.
One approach would be to split age into two variables and convert age into a numeric variable. Then, you can sort by that column and get your expected results.
library(tidyverse)
LX <- data.frame(
age = c("10-WNW", "0-N", "4-ESE", "1-NNE", "2-ENE", "3-E", "11-NNW", "4-ESE"),
income = c( 25.2, 10.5, 11, 21.9, 44, 11.5, 45, 16))
LX %>%
separate(age, into = c("age", "direction"), sep = "-") %>%
mutate(age = as.numeric(age)) %>%
arrange(age)
#> age direction income
#> 1 0 N 10.5
#> 2 1 NNE 21.9
#> 3 2 ENE 44.0
#> 4 3 E 11.5
#> 5 4 ESE 11.0
#> 6 4 ESE 16.0
#> 7 10 WNW 25.2
#> 8 11 NNW 45.0
Yeah, just tested your suggestion with my sampled datasaset. It worked fine (plotting the wind rose using age and income) except that the plot of the wind rose ( direction with income ) doesn't produce the right result after sorting the direction with respect to the income. It sorted the alphabets (N, ESE, W, SSW...) in ascending order (A., B, C,..... Z) and by the time the wind rose is plotted, it makes the first alphabet as its reference point instead of the first letter in the Column.
Wind Rose (age and income)
#> age income
#> 1 0 10.5
Wind Rose (direction and income)
#> direction. income
#> 1 E. 11.5
I will just opt for the plot of the wind rose based on the age and income. Thus, the desired result is obtained with your suggestion.