rggplot2legendfill

Ggplot2 fill legend labels not in correct order


I am creating the following graph with ggplot2. The problem is that all labels show in the chronological order except the last three. I cannot work around it. Does anyone see what causes the issue and how to circumvent it?

quarterly_dates <- seq(start_date, end_date, by = "3 months")
random_numbers <- runif(length(quarterly_dates), min = 30, max = 60)
approval_q_graph = data.frame(cbind(quarterly_dates,random_numbers))
colnames(approval_q_graph) = c("End Date","Approval")

plot3=ggplot() +
  geom_line(aes(x = approval_q_graph$`End Date`, y =approval_q_graph$Approval))+
    theme_classic() +
  labs(title="Presidential Approval Rating Quarterly",subtitle="Gallup; 1953-2023")+xlab("Time")+ylab("Percent")+
  geom_rect(aes(xmin=as.Date("1953-01-01"),xmax=as.Date("1961-01-01")
            ,fill="bisque"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("1961-01-01"),xmax=as.Date("1963-10-01")
            ,fill="black"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("1963-10-01"),xmax=as.Date("1969-01-01")
            ,fill="blue"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("1969-01-01"),xmax=as.Date("1974-10-01")
            ,fill="brown"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("1974-10-01"),xmax=as.Date("1977-01-01")
            ,fill="cyan"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("1977-01-01"),xmax=as.Date("1981-01-01")
            ,fill="green"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("1981-01-01"),xmax=as.Date("1989-01-01")
            ,fill="orange"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("1989-01-01"),xmax=as.Date("1993-01-01")
            ,fill="pink"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("1993-01-01"),xmax=as.Date("2001-01-01")
            ,fill="purple"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("2001-01-01"),xmax=as.Date("2009-01-01")
            ,fill="red"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("2009-01-01"),xmax=as.Date("2017-01-01")
            ,fill="yellow"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("2017-01-01"),xmax=as.Date("2021-01-01")
            ,fill="sienna"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  geom_rect(aes(xmin=as.Date("2021-01-01"),xmax=as.Date("2023-10-01")
            ,fill="royalblue1"),ymin=0,ymax=100, size=0.5, alpha=0.1) +
  
  scale_fill_identity(labels = c(
      bisque = "Eisenhower",
      black = "Kennedy", blue = "Johnson",
      brown = "Nixon", cyan = "Ford",
      green = "Carter", orange = "Reagan",
      pink = "Bush Senior", purple = "Clinton",
      red = "Bush Junior", yellow = "Obama", sienna = "Trump",royalblue1 = "Biden"
    ),guide="legend",name=NULL,aesthetics = "fill")
print(plot3)

Alternatively:

dput(approval_q_graph) 

gives the following output:

structure(list(Approval = c(67.5, 73.6666666666667, 69.25, 63.5, 
68.5, 62.75, 67.2, 62.3333333333333, 70, 68.75, 72.5, 76.5, 75, 
71, 69, 77, 70.5, 64.25, 61.8, 57.5, 55.75, 52.25, 55.4, 55.3333333333333, 
58, 62, 64.6666666666667, 69, 64.6666666666667, 63.25, 58.5, 
60.25, 72.5, 76.3333333333333, 76.6666666666667, 77.6666666666667, 
78.6666666666667, 74, 66.25, 70.3333333333333, 70.3333333333333, 
64, 59.6666666666667, 67, 76.4, 74.4285714285714, 69.5, 69.2, 
67, 64.25, 64, 58.2, 49.5, 50, 45.25, 45.75, 46.8, 41, 41.75, 
41.5, 44.75, 39.25, 43.5, 58.25, 62.6666666666667, 60.6, 59.75, 
59.6, 56.75, 55.8, 55.6666666666667, 51.6666666666667, 49, 49.5, 
50.3333333333333, 52.5, 57.75, 60.5, 61, 48, 34.6, 28.8, 26.5, 
25.875, 43.8333333333333, 48.6, 38, 45.2, 45.3333333333333, 44, 
47, 46.6666666666667, 53, 70.8, 64.1428571428571, 61.8, 55.2857142857143, 
50.5, 42.7142857142857, 42, 50.5, 42.8571428571429, 33.4, 30.6666666666667, 
38.2857142857143, 50.5, 36.8333333333333, 34, 32.5, 55.3333333333333, 
63, 57.6, 52.2, 47.25, 44.3333333333333, 41.6, 42.25, 38, 43.8333333333333, 
44.2857142857143, 50.25, 54, 53.8, 54.5714285714286, 58.8, 60.5, 
55, 61.25, 63.25, 63.5, 63.75, 62, 52.6666666666667, 46, 49.3333333333333, 
47.6666666666667, 50, 50, 49.4, 52.6666666666667, 56.25, 56.6666666666667, 
61.75, 68.3333333333333, 69.6666666666667, 73.6, 67.2, 70.8888888888889, 
58.1, 79.7142857142857, 75.5555555555556, 70.1111111111111, 58.4, 
43, 39.1428571428571, 35.7142857142857, 41.6, 54.7142857142857, 
44.3333333333333, 46.1428571428571, 49.625, 52.75, 48.1666666666667, 
41.5714285714286, 43, 45.6, 48.4, 46.2857142857143, 50.2, 49.8333333333333, 
54.6666666666667, 56.7142857142857, 57, 59.2, 55.75, 59.6, 58, 
62.8888888888889, 61.75, 63.375, 65.7, 66.1818181818182, 58.7777777777778, 
59.875, 57.5, 61, 58.3333333333333, 59.25, 60.8, 60.125, 56.5714285714286, 
61.6, 87.125, 81.1, 75.0833333333333, 68.9166666666667, 64.4545454545455, 
61.4666666666667, 66.5, 57.1428571428571, 54.7777777777778, 52.7, 
49, 50.25, 50.5, 51.3, 47.5454545454545, 44.7272727272727, 40.6, 
40.125, 35.25, 39.8571428571429, 37, 34.75, 34.1666666666667, 
32.5, 32.8571428571429, 32.5, 28.4285714285714, 30.8571428571429, 
28, 60.9090909090909, 62.6153846153846, 54.3846153846154, 51.3846153846154, 
49.4615384615385, 47.6923076923077, 44.9230769230769, 45.3846153846154, 
47.8461538461538, 46.7692307692308, 42.2307692307692, 42.3076923076923, 
45.4615384615385, 47, 46.5714285714286, 51.7692307692308, 50.5384615384615, 
48.5384615384615, 45.2307692307692, 41.7692307692308, 41.8461538461538, 
43.3846153846154, 41.8461538461538, 42.3846153846154, 46.3076923076923, 
46.4615384615385, 46, 46.5384615384615, 48.5384615384615, 51.1538461538462, 
51.3076923076923, 54.8461538461538, 46.2307692307692, 39.3076923076923, 
37.3076923076923, 36.8571428571429, 38.5, 41.2307692307692, 40.8571428571429, 
40.5833333333333, 40, 42.8333333333333, 41.5, 42, 47, 43.6, 42.75, 
42.75, 50.25, 55.6666666666667, 47.3333333333333, 42.3333333333333, 
41, 41, 41.3333333333333, 40, 41, 39.6666666666667, 41), `End Date` = c(-6209, 
-6119, -6028, -5936, -5844, -5754, -5663, -5571, -5479, -5389, 
-5298, -5206, -5114, -5023, -4932, -4840, -4748, -4658, -4567, 
-4475, -4383, -4293, -4202, -4110, -4018, -3928, -3837, -3745, 
-3653, -3562, -3471, -3379, -3287, -3197, -3106, -3014, -2922, 
-2832, -2741, -2649, -2557, -2467, -2376, -2284, -2192, -2101, 
-1918, -1826, -1736, -1645, -1553, -1461, -1371, -1280, -1188, 
-1096, -1006, -915, -823, -731, -640, -549, -457, -365, -275, 
-184, -92, 0, 90, 181, 273, 365, 455, 546, 638, 730, 821, 1004, 
1096, 1186, 1277, 1369, 1461, 1551, 1642, 1734, 1826, 1916, 2007, 
2099, 2191, 2282, 2465, 2557, 2647, 2738, 2830, 2922, 3012, 3103, 
3195, 3287, 3377, 3468, 3560, 3652, 3743, 3834, 3926, 4018, 4108, 
4199, 4291, 4383, 4473, 4564, 4656, 4748, 4838, 4929, 5021, 5113, 
5204, 5295, 5387, 5479, 5569, 5660, 5752, 5844, 5934, 6025, 6117, 
6209, 6299, 6390, 6482, 6574, 6665, 6756, 6848, 6940, 7030, 7121, 
7213, 7305, 7395, 7486, 7578, 7670, 7760, 7851, 7943, 8035, 8126, 
8217, 8309, 8401, 8491, 8582, 8674, 8766, 8856, 8947, 9039, 9131, 
9221, 9312, 9404, 9496, 9587, 9678, 9770, 9862, 9952, 10043, 
10135, 10227, 10317, 10408, 10500, 10592, 10682, 10773, 10865, 
10957, 11048, 11139, 11231, 11323, 11413, 11504, 11596, 11688, 
11778, 11869, 11961, 12053, 12143, 12234, 12326, 12418, 12509, 
12600, 12692, 12784, 12874, 12965, 13057, 13149, 13239, 13330, 
13422, 13514, 13604, 13695, 13787, 13879, 13970, 14061, 14153, 
14245, 14335, 14426, 14518, 14610, 14700, 14791, 14883, 14975, 
15065, 15156, 15248, 15340, 15431, 15522, 15614, 15706, 15796, 
15887, 15979, 16071, 16161, 16252, 16344, 16436, 16526, 16617, 
16709, 16801, 16892, 16983, 17075, 17167, 17257, 17348, 17440, 
17532, 17622, 17713, 17805, 17897, 17987, 18078, 18170, 18262, 
18353, 18444, 18536, 18628, 18718, 18809, 18901, 18993, 19083, 
19174, 19266, 19358, 19448, 19539)), class = "data.frame", row.names = c(NA, 
-280L))

Solution

  • Here is a nicer approach:

    approval_q_graph$`End Date` <- as.Date(approval_q_graph$`End Date`) #assuming this is days since 1970-01-01
    
    boxes <- data.frame(xmin = as.Date(c("1953-01-01", "1961-01-01", "1963-10-01",
                                 "1969-01-01", "1974-10-01", "1977-01-01",
                                 "1981-01-01", "1989-01-01", "1993-01-01",
                                 "2001-01-01", "2009-01-01", "2017-01-01",
                                 "2021-01-01")),
                        xmax = as.Date(c("1961-01-01", "1963-10-01",
                                 "1969-01-01", "1974-10-01", "1977-01-01",
                                 "1981-01-01", "1989-01-01", "1993-01-01",
                                 "2001-01-01", "2009-01-01", "2017-01-01",
                                 "2021-01-01", "2023-10-01")),
                        President = ordered(1:13, labels = c("Eisenhower",
                                      "Kennedy", "Johnson",
                                      "Nixon","Ford",
                                      "Carter","Reagan",
                                      "Bush Senior", "Clinton",
                                      "Bush Junior", "Obama", 
                                      "Trump","Biden"))
    )
    
    ggplot(approval_q_graph) +
      geom_rect(data = boxes, 
                aes(xmin = xmin, xmax = xmax, ymin = 0, ymax = 100, fill = President), 
                    alpha = 0.1) + #plot the rectangles before the line is plotted
      geom_line(aes(x = `End Date`, y = Approval))+
      theme_classic() +
      labs(title="Presidential Approval Rating Quarterly",subtitle="Gallup; 1953-2023")+
      xlab("Time")+ylab("Percent") +
      scale_fill_manual(values = setNames(c("bisque", "black", "blue", "brown", "cyan", "green",
                                   "orange", "pink", "purple", "red", "yellow", "sienna", "royalblue1"),
                                   levels(boxes$President)))
    

    resulting plot