Chris Ruehlemann
Chris Ruehlemann

Reputation: 21400

Fix mismatch between plot colors and legend colors

I have large dataframes of which I can show here only a snippet:

df4 <- structure(list(AOI = c("*", "C", "*", "C", "C", "*", "*", "C", 
"*", "C", "C", "C", "C", "*", "B", "*", "C", "*", "C", "C", "C", 
"*", "B", "*", "*", "*", "B", "*", "B", "B", "*", "*", "B", "B", 
"B", "*", "B", "*", "B", "B", "B", "*", "B", "*", "*", "*", "B", 
"*", "*", "B", "*", "*", "B", "*", "B", "*", "B", "*", "B", "*", 
"B", "*", "*", "B", "B", "*", "B", "B", "B", "*", "*", "*", "*", 
"B", "B", "*", "B", "*", "B", "*", "B", "B", "*", "B", "*", "B", 
"*", "B", "*", "B", "*", "B", "*", "C", "*", "B", "*", "B", "*", 
"B", "*", "*", "B", "*", "B", "*", "*", "*", "B", "B", "*", "*", 
"C", "*", "B", "*", "*", "*", "B", "B", "*", "B", "*", "B", "B", 
"*", "B", "*", "*", "B", "*", "C", "*", "B", "*", "C", "*", "B", 
"*", "C", "*", "C", "*", "B", "*", "B", "*", "C", "C", "C"), 
    AOI_col = c("lemonchiffon", "slateblue1", "lemonchiffon", 
    "slateblue1", "slateblue1", "lemonchiffon", "lemonchiffon", 
    "slateblue1", "lemonchiffon", "slateblue1", "slateblue1", 
    "slateblue1", "slateblue1", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "slateblue1", "lemonchiffon", "slateblue1", 
    "slateblue1", "slateblue1", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "lemonchiffon", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "lawngreen", "lawngreen", "lemonchiffon", 
    "lemonchiffon", "lawngreen", "lawngreen", "lawngreen", "lemonchiffon", 
    "lawngreen", "lemonchiffon", "lawngreen", "lawngreen", "lawngreen", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "lemonchiffon", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "lemonchiffon", 
    "lawngreen", "lemonchiffon", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "lemonchiffon", "lawngreen", "lawngreen", 
    "lemonchiffon", "lawngreen", "lawngreen", "lawngreen", "lemonchiffon", 
    "lemonchiffon", "lemonchiffon", "lemonchiffon", "lawngreen", 
    "lawngreen", "lemonchiffon", "lawngreen", "lemonchiffon", 
    "lawngreen", "lemonchiffon", "lawngreen", "lawngreen", "lemonchiffon", 
    "lawngreen", "lemonchiffon", "lawngreen", "lemonchiffon", 
    "lawngreen", "lemonchiffon", "lawngreen", "lemonchiffon", 
    "lawngreen", "lemonchiffon", "slateblue1", "lemonchiffon", 
    "lawngreen", "lemonchiffon", "lawngreen", "lemonchiffon", 
    "lawngreen", "lemonchiffon", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "lemonchiffon", 
    "lemonchiffon", "lawngreen", "lawngreen", "lemonchiffon", 
    "lemonchiffon", "slateblue1", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "lemonchiffon", "lemonchiffon", "lawngreen", 
    "lawngreen", "lemonchiffon", "lawngreen", "lemonchiffon", 
    "lawngreen", "lawngreen", "lemonchiffon", "lawngreen", "lemonchiffon", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "slateblue1", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "slateblue1", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "slateblue1", 
    "lemonchiffon", "slateblue1", "lemonchiffon", "lawngreen", 
    "lemonchiffon", "lawngreen", "lemonchiffon", "slateblue1", 
    "slateblue1", "slateblue1"), minute = c(0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), start_pm = c(0, 
    49, 1981, 2147, 5127, 6115, 6830, 6847, 7048, 7180, 7685, 
    9889, 9990, 10080, 10236, 10385, 11249, 12000, 12402, 14051, 
    14253, 17033, 17618, 17768, 18051, 19503, 20067, 20246, 20414, 
    20647, 20952, 20994, 21169, 21427, 21905, 23752, 23969, 24335, 
    24803, 25032, 25318, 25319, 25569, 25719, 26610, 26970, 27403, 
    27552, 27759, 27936, 28085, 28123, 28469, 29369, 30236, 30419, 
    30569, 30985, 31303, 31485, 32269, 33452, 33603, 33803, 34188, 
    34652, 35065, 35297, 35599, 36814, 39042, 39290, 39558, 39565, 
    39575, 39715, 39865, 40481, 40732, 41148, 41365, 41395, 41481, 
    41698, 41964, 42098, 42281, 42465, 42948, 43447, 43681, 43998, 
    45314, 45582, 45980, 47065, 47214, 47598, 48181, 48398, 48581, 
    49010, 49067, 49250, 49434, 49917, 49996, 50022, 50418, 50496, 
    50567, 50674, 51901, 52117, 53284, 53467, 57019, 57434, 57533, 
    57584, 57682, 57833, 57982, 59333, 0, 82, 2366, 2515, 5257, 
    6871, 7037, 7137, 7538, 7722, 7872, 8104, 8355, 8422, 8605, 
    10004, 10405, 10872, 11337, 11456, 11688, 12122, 12272, 13337, 
    14057, 14597), end_pm = c(49, 1981, 2147, 5127, 6115, 6830, 
    6847, 7048, 7180, 7685, 9889, 9990, 10080, 10236, 10385, 
    11249, 12000, 12402, 14051, 14253, 17033, 17618, 17768, 18051, 
    19503, 20067, 20246, 20414, 20647, 20952, 20994, 21169, 21427, 
    21905, 23752, 23969, 24335, 24803, 25032, 25318, 25319, 25569, 
    25719, 26610, 26970, 27403, 27552, 27759, 27936, 28085, 28123, 
    28469, 29369, 30236, 30419, 30569, 30985, 31303, 31485, 32269, 
    33452, 33603, 33803, 34188, 34652, 35065, 35297, 35599, 36814, 
    39042, 39290, 39558, 39565, 39575, 39715, 39865, 40481, 40732, 
    41148, 41365, 41395, 41481, 41698, 41964, 42098, 42281, 42465, 
    42948, 43447, 43681, 43998, 45314, 45582, 45980, 47065, 47214, 
    47598, 48181, 48398, 48581, 49010, 49067, 49250, 49434, 49917, 
    49996, 50022, 50418, 50496, 50567, 50674, 51901, 52117, 53284, 
    53467, 57019, 57434, 57533, 57584, 57682, 57833, 57982, 59333, 
    60000, 82, 2366, 2515, 5257, 6871, 7037, 7137, 7538, 7722, 
    7872, 8104, 8355, 8422, 8605, 10004, 10405, 10872, 11337, 
    11456, 11688, 12122, 12272, 13337, 14057, 14597, 15245)), row.names = c(NA, 
-150L), class = c("tbl_df", "tbl", "data.frame"))

What I want to do is plot the AOI values using the colors in AOI_col. The problem is that there is a mismatch between the plot colors and the legend colors: when AOI=="B" the plot color is, correctly, lawngreen but in the legend the color for B is slateblue1:

enter image description here

How can I fix this mismatch?

Here's the code for the plot:

library(ggplot2)
ggplot(df4,
       aes(
         x = start_pm,
         xend = end_pm,
         y = minute + scale(as.numeric(as.factor(AOI))) / 10,
         yend = minute + scale(as.numeric(as.factor(AOI))) / 10,
         color = AOI
       )) +
  geom_segment(size = 2) +
  scale_y_reverse(breaks = 0:53,
                  labels = paste0(0:53, "min"),
                  name = NULL) +
  theme(axis.title.x.bottom = element_blank()) +
  scale_colour_manual(values = unique(df4$AOI_col))

Upvotes: 0

Views: 53

Answers (2)

Martin Gal
Martin Gal

Reputation: 16988

Your

scale_colour_manual(values = unique(df4$AOI_col))

needs to be in the right order, so

scale_colour_manual(values = c("lemonchiffon", "lawngreen", "slateblue1"))

should solve your mismatch problem. Alternatively, you can create a named vector

vec_col <- unique(df4$AOI_col)
names(vec_col) <- unique(df4$AOI)

and match the colors

scale_colour_manual(values = vec_col[unique(df4$AOI)])

Upvotes: 0

Mohanasundaram
Mohanasundaram

Reputation: 2949

In scale_colour_manual(), assign the colours individually.

ggplot(df4,
       aes(
         x = start_pm,
         xend = end_pm,
         y = minute + scale(as.numeric(as.factor(AOI))) / 10,
         yend = minute + scale(as.numeric(as.factor(AOI))) / 10,
         color = AOI
       )) +
  geom_segment(size = 2) +
  scale_y_reverse(breaks = 0:53,
                  labels = paste0(0:53, "min"),
                  name = NULL) +
  theme(axis.title.x.bottom = element_blank()) +
  scale_colour_manual(values = c("A" = unique(df4$AOI_col)[1],
                                 "B" = unique(df4$AOI_col)[3],
                                 "C" = unique(df4$AOI_col)[2]))

or you can reorder the colours by the index

ggplot(df4,
       aes(
         x = start_pm,
         xend = end_pm,
         y = minute + scale(as.numeric(as.factor(AOI))) / 10,
         yend = minute + scale(as.numeric(as.factor(AOI))) / 10,
         color = AOI
       )) +
  geom_segment(size = 2) +
  scale_y_reverse(breaks = 0:53,
                  labels = paste0(0:53, "min"),
                  name = NULL) +
  theme(axis.title.x.bottom = element_blank()) +
  scale_colour_manual(values = unique(df4$AOI_col)[c(1, 3, 2)])

enter image description here

Upvotes: 1

Related Questions