# How to figure out which factor level has been mapped to which value on a barplot?

## Issue

My question is very similar to this one Hot to figure out which factor level has been mapped to which fill color on a barplot in R?.
Now I’m struggling with similar problem, however in this case I have a discrete scale.
My plot is like this:

``````# The data
plot_data <- structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3,
24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7, 32.4,
30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26, 30.4, 15.8,
19.7, 15, 21.4), cyl = structure(c(2L, 2L, 1L, 2L, 3L, 2L, 3L,
1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 3L, 3L,
3L, 3L, 1L, 1L, 1L, 3L, 2L, 3L, 1L), .Label = c("4", "6", "8"
), class = "factor"), disp = c(160, 160, 108, 258, 360, 225,
360, 146.7, 140.8, 167.6, 167.6, 275.8, 275.8, 275.8, 472, 460,
440, 78.7, 75.7, 71.1, 120.1, 318, 304, 350, 400, 79, 120.3,
95.1, 351, 145, 301, 121), hp = c(110, 110, 93, 110, 175, 105,
245, 62, 95, 123, 123, 180, 180, 180, 205, 215, 230, 66, 52,
65, 97, 150, 150, 245, 175, 66, 91, 113, 264, 175, 335, 109),
drat = c(3.9, 3.9, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92,
3.92, 3.92, 3.07, 3.07, 3.07, 2.93, 3, 3.23, 4.08, 4.93,
4.22, 3.7, 2.76, 3.15, 3.73, 3.08, 4.08, 4.43, 3.77, 4.22,
3.62, 3.54, 4.11), wt = c(2.62, 2.875, 2.32, 3.215, 3.44,
3.46, 3.57, 3.19, 3.15, 3.44, 3.44, 4.07, 3.73, 3.78, 5.25,
5.424, 5.345, 2.2, 1.615, 1.835, 2.465, 3.52, 3.435, 3.84,
3.845, 1.935, 2.14, 1.513, 3.17, 2.77, 3.57, 2.78), qsec = c(16.46,
17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20, 22.9, 18.3,
18.9, 17.4, 17.6, 18, 17.98, 17.82, 17.42, 19.47, 18.52,
19.9, 20.01, 16.87, 17.3, 15.41, 17.05, 18.9, 16.7, 16.9,
14.5, 15.5, 14.6, 18.6), vs = structure(c(1L, 1L, 2L, 2L,
1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L), .Label = c("0",
"1"), class = "factor"), am = structure(c(NA, NA, NA, 1L,
1L, 1L, 1L, NA, NA, NA, NA, 1L, 1L, 1L, 1L, 1L, 1L, NA, NA,
NA, 1L, 1L, 1L, 1L, 1L, NA, 2L, 2L, 2L, 2L, 2L, NA), .Label = c("0",
"1"), class = "factor"), gear = structure(c(2L, 2L, 2L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 1L, 1L, 1L, 1L, 1L, 2L, 3L, 3L, 3L, 3L, 3L, 2L), .Label = c("3",
"4", "5"), class = "factor"), carb = structure(c(4L, 4L,
1L, 1L, 2L, 1L, 4L, 2L, 2L, 4L, 4L, 3L, 3L, 3L, 4L, 4L, 4L,
1L, 2L, 1L, 1L, 2L, 2L, 4L, 2L, 1L, 2L, 2L, 4L, 5L, 6L, 2L
), .Label = c("1", "2", "3", "4", "6", "8"), class = "factor")), row.names = c("Mazda RX4",
"Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout",
"Valiant", "Duster 360", "Merc 240D", "Merc 230", "Merc 280",
"Merc 280C", "Merc 450SE", "Merc 450SL", "Merc 450SLC", "Cadillac Fleetwood",
"Lincoln Continental", "Chrysler Imperial", "Fiat 128", "Honda Civic",
"Toyota Corolla", "Toyota Corona", "Dodge Challenger", "AMC Javelin",
"Camaro Z28", "Pontiac Firebird", "Fiat X1-9", "Porsche 914-2",
"Lotus Europa", "Ford Pantera L", "Ferrari Dino", "Maserati Bora",
"Volvo 142E"), class = "data.frame")
``````
``````# The plot
p <- ggplot(
data = plot_data,
aes(x = am, fill = cyl)
) + geom_bar(position = "dodge") + facet_wrap("gear")
``````

Now, when I examine the dataset connected to the plot this way:

``````df <- ggplot2::ggplot_build(p)
df <- df\$data
``````

I see something like this:

``````     fill  y count prop     x flipped_aes PANEL group ymin ymax xmin xmax colour size linetype alpha
1 #F8766D  1     1    1 0.700       FALSE     1     1    0    1 0.55 0.85     NA  0.5        1    NA
2 #00BA38  2     2    1 1.000       FALSE     1     2    0    2 0.85 1.15     NA  0.5        1    NA
3 #619CFF 12    12    1 1.300       FALSE     1     3    0   12 1.15 1.45     NA  0.5        1    NA
4 #F8766D  8     8    1 2.775       FALSE     2     7    0    8 2.55 3.00     NA  0.5        1    NA
5 #00BA38  4     4    1 3.225       FALSE     2     8    0    4 3.00 3.45     NA  0.5        1    NA
6 #F8766D  2     2    1 1.700       FALSE     3     4    0    2 1.55 1.85     NA  0.5        1    NA
7 #00BA38  1     1    1 2.000       FALSE     3     5    0    1 1.85 2.15     NA  0.5        1    NA
8 #619CFF  2     2    1 2.300       FALSE     3     6    0    2 2.15 2.45     NA  0.5        1    NA
``````

How do I know what "x" values from the data frame above are mapped to what values from the original data? I know, by manual examination, that x=2.775 and x=3.225 are NAs, but how to get it from ggplot?

I tried looking to scales attributes of the built object but ended up with nothing.

## Solution

This is far from a perfect answer and is based on trial and error while poking the ggplot object… but it gets you he labels from layout to data:

``````pl <- ggplot2::ggplot_build(p)
d <- pl\$data[[1]]

# round position to integer
d\$matchlabel <- round(d\$x)

# get the plot labels from the layout part of the object
labs <- pl\$layout\$panel_scales_x[[1]]\$range\$range

# select labels acording to position integer
d\$label <- labs[d\$matchlabel]

d

fill  y count prop     x flipped_aes PANEL group ymin ymax xmin xmax colour size linetype alpha matchlabel label
1 #F8766D  1     1    1 0.700       FALSE     1     1    0    1 0.55 0.85     NA  0.5        1    NA          1     0
2 #00BA38  2     2    1 1.000       FALSE     1     2    0    2 0.85 1.15     NA  0.5        1    NA          1     0
3 #619CFF 12    12    1 1.300       FALSE     1     3    0   12 1.15 1.45     NA  0.5        1    NA          1     0
4 #F8766D  8     8    1 2.775       FALSE     2     7    0    8 2.55 3.00     NA  0.5        1    NA          3  <NA>
5 #00BA38  4     4    1 3.225       FALSE     2     8    0    4 3.00 3.45     NA  0.5        1    NA          3  <NA>
6 #F8766D  2     2    1 1.700       FALSE     3     4    0    2 1.55 1.85     NA  0.5        1    NA          2     1
7 #00BA38  1     1    1 2.000       FALSE     3     5    0    1 1.85 2.15     NA  0.5        1    NA          2     1
8 #619CFF  2     2    1 2.300       FALSE     3     6    0    2 2.15 2.45     NA  0.5        1    NA          2     1
``````