Reputation: 43
I want to add a series of arrows connecting each observation in geom_point as in the graph:
I understand that geom_segment is meant to be used, but I am having issues, and have not found something quite like this after quite a bit of searching.
This is sample code that should satisfy the pattern:
Note: The labels are not important ; just the arrows
df <- data.frame(year = c(1935:1968),
y_axis_values = c( 2755,2696, 2646, 2701, 2654, 2766, 2832, 2964, 3041, 3010, 3018, 3374, 3545, 3441, 3456, 3455, 3503, 3641, 3721, 3828, 3831, 3858, 3925, 3880, 3935, 3895, 3840, 3756, 3669, 3502, 3145, 2812, 2586,2441),
x_axis_values = c(238, 240, 241, 242, 244, 245, 246, 268, 333, 335, 331, 253, 243, 241, 242, 237, 242, 240, 233, 232, 236, 245, 256, 261, 265, 278, 291, 290, 290, 307, 313, 325, 339, 338)
I have tried the general formula with many different argument variations, but cannot seem to find it.
ggplot(df, aes(x = x_axis_values, y = y_axis_values) +
geom_point() +
geom_segment()
Upvotes: 0
Views: 477
Reputation: 173858
You need the xend and yend values for each segment. Since your data frame is in order, the xend and yend value for each segment is just the next row's x and y values. You can get these by using dplyr::lead
on the x and y aesthetics.
library(ggplot2)
library(dplyr)
ggplot(df, aes(x = x_axis_values, y = y_axis_values)) +
geom_point(color = "#69b3a2") +
geom_segment(aes(xend = after_stat(lead(x)), yend = after_stat(lead(y))),
arrow = arrow(length = unit(3, "mm")), color = "#69b3a2") +
geom_text(aes(label = year), size = 5, fontface = 2,
data = . %>% filter(year %in% c(1935, 1937, 1939, 1942, 1945, 1946,
1953, 1957, 1960, 1961)),
nudge_x = c(-3, -2, 4, 0, 0, -2, -5, 0, 3, 5),
nudge_y = c(30, -30, 10, -30, -40, -40, 0, -50, 30, 0)) +
labs(x = "partic", y = "tfr") +
theme_bw(base_size = 16)
Upvotes: 1