Search code examples
rggplot2

Add a secundary reverse x-axis ggplot2


I have the following data example of a spectral analysis.

    structure(list(x = c(0.555555555555556, 0.555555555555556, 0.555555555555556, 
0.555555555555556, 0.555555555555556, 0.555555555555556, 0.555555555555556, 
1.11111111111111, 1.11111111111111, 1.11111111111111, 1.11111111111111, 
1.11111111111111, 1.11111111111111, 1.11111111111111, 1.66666666666667, 
1.66666666666667, 1.66666666666667, 1.66666666666667, 1.66666666666667, 
1.66666666666667, 1.66666666666667, 2.22222222222222, 2.22222222222222, 
2.22222222222222, 2.22222222222222, 2.22222222222222, 2.22222222222222, 
2.22222222222222, 2.77777777777778, 2.77777777777778, 2.77777777777778, 
2.77777777777778, 2.77777777777778, 2.77777777777778, 2.77777777777778, 
3.33333333333333, 3.33333333333333, 3.33333333333333, 3.33333333333333, 
3.33333333333333, 3.33333333333333, 3.33333333333333, 3.88888888888889, 
3.88888888888889, 3.88888888888889, 3.88888888888889, 3.88888888888889, 
3.88888888888889, 3.88888888888889, 4.44444444444444, 4.44444444444444, 
4.44444444444444, 4.44444444444444, 4.44444444444444, 4.44444444444444, 
4.44444444444444, 5, 5, 5, 5, 5, 5, 5, 5.55555555555556, 5.55555555555556, 
5.55555555555556, 5.55555555555556, 5.55555555555556, 5.55555555555556, 
5.55555555555556, 6.11111111111111, 6.11111111111111, 6.11111111111111, 
6.11111111111111, 6.11111111111111, 6.11111111111111, 6.11111111111111, 
6.66666666666667, 6.66666666666667, 6.66666666666667, 6.66666666666667, 
6.66666666666667, 6.66666666666667, 6.66666666666667, 7.22222222222222, 
7.22222222222222, 7.22222222222222, 7.22222222222222, 7.22222222222222, 
7.22222222222222, 7.22222222222222, 7.77777777777778, 7.77777777777778, 
7.77777777777778, 7.77777777777778, 7.77777777777778, 7.77777777777778, 
7.77777777777778, 8.33333333333333, 8.33333333333333, 20, 20, 
20, 20.5555555555556, 20.5555555555556, 20.5555555555556, 20.5555555555556, 
20.5555555555556, 20.5555555555556, 20.5555555555556, 21.1111111111111, 
21.1111111111111, 21.1111111111111, 21.1111111111111, 21.1111111111111, 
21.1111111111111, 21.1111111111111, 21.6666666666667, 21.6666666666667, 
21.6666666666667, 21.6666666666667, 21.6666666666667, 21.6666666666667, 
21.6666666666667, 22.2222222222222, 22.2222222222222, 22.2222222222222, 
22.2222222222222, 22.2222222222222, 22.2222222222222, 22.2222222222222, 
22.7777777777778, 22.7777777777778, 22.7777777777778, 22.7777777777778, 
22.7777777777778, 22.7777777777778, 22.7777777777778, 23.3333333333333, 
23.3333333333333, 23.3333333333333, 23.3333333333333, 23.3333333333333, 
23.3333333333333, 23.3333333333333, 23.8888888888889, 23.8888888888889, 
23.8888888888889, 23.8888888888889, 23.8888888888889, 23.8888888888889, 
23.8888888888889, 24.4444444444444, 24.4444444444444, 24.4444444444444, 
24.4444444444444, 24.4444444444444, 24.4444444444444, 24.4444444444444, 
25, 25, 25, 25, 25, 25, 25, 25.5555555555556, 25.5555555555556, 
25.5555555555556, 25.5555555555556, 25.5555555555556, 25.5555555555556, 
25.5555555555556, 26.1111111111111, 26.1111111111111, 26.1111111111111, 
26.1111111111111, 26.1111111111111, 26.1111111111111, 26.1111111111111, 
26.6666666666667, 26.6666666666667, 26.6666666666667, 26.6666666666667, 
26.6666666666667, 26.6666666666667, 26.6666666666667, 27.2222222222222, 
27.2222222222222, 27.2222222222222, 27.2222222222222, 27.2222222222222, 
27.2222222222222, 27.2222222222222, 27.7777777777778, 27.7777777777778, 
27.7777777777778, 27.7777777777778, 27.7777777777778, 27.7777777777778, 
27.7777777777778), period = c(500, 500, 500, 500, 500, 500, 500, 
250, 250, 250, 250, 250, 250, 250, 166.666666666667, 166.666666666667, 
166.666666666667, 166.666666666667, 166.666666666667, 166.666666666667, 
166.666666666667, 125, 125, 125, 125, 125, 125, 125, 100, 100, 
100, 100, 100, 100, 100, 83.3333333333333, 83.3333333333333, 
83.3333333333333, 83.3333333333333, 83.3333333333333, 83.3333333333333, 
83.3333333333333, 71.4285714285714, 71.4285714285714, 71.4285714285714, 
71.4285714285714, 71.4285714285714, 71.4285714285714, 71.4285714285714, 
62.5, 62.5, 62.5, 62.5, 62.5, 62.5, 62.5, 55.5555555555555, 55.5555555555555, 
55.5555555555555, 55.5555555555555, 55.5555555555555, 55.5555555555555, 
55.5555555555555, 50, 50, 50, 50, 50, 50, 50, 45.4545454545455, 
45.4545454545455, 45.4545454545455, 45.4545454545455, 45.4545454545455, 
45.4545454545455, 45.4545454545455, 41.6666666666667, 41.6666666666667, 
41.6666666666667, 41.6666666666667, 41.6666666666667, 41.6666666666667, 
41.6666666666667, 38.4615384615385, 38.4615384615385, 38.4615384615385, 
38.4615384615385, 38.4615384615385, 38.4615384615385, 38.4615384615385, 
35.7142857142857, 35.7142857142857, 35.7142857142857, 35.7142857142857, 
35.7142857142857, 35.7142857142857, 35.7142857142857, 33.3333333333333, 
33.3333333333333, 13.8888888888889, 13.8888888888889, 13.8888888888889, 
13.5135135135135, 13.5135135135135, 13.5135135135135, 13.5135135135135, 
13.5135135135135, 13.5135135135135, 13.5135135135135, 13.1578947368421, 
13.1578947368421, 13.1578947368421, 13.1578947368421, 13.1578947368421, 
13.1578947368421, 13.1578947368421, 12.8205128205128, 12.8205128205128, 
12.8205128205128, 12.8205128205128, 12.8205128205128, 12.8205128205128, 
12.8205128205128, 12.5, 12.5, 12.5, 12.5, 12.5, 12.5, 12.5, 12.1951219512195, 
12.1951219512195, 12.1951219512195, 12.1951219512195, 12.1951219512195, 
12.1951219512195, 12.1951219512195, 11.9047619047619, 11.9047619047619, 
11.9047619047619, 11.9047619047619, 11.9047619047619, 11.9047619047619, 
11.9047619047619, 11.6279069767442, 11.6279069767442, 11.6279069767442, 
11.6279069767442, 11.6279069767442, 11.6279069767442, 11.6279069767442, 
11.3636363636364, 11.3636363636364, 11.3636363636364, 11.3636363636364, 
11.3636363636364, 11.3636363636364, 11.3636363636364, 11.1111111111111, 
11.1111111111111, 11.1111111111111, 11.1111111111111, 11.1111111111111, 
11.1111111111111, 11.1111111111111, 10.8695652173913, 10.8695652173913, 
10.8695652173913, 10.8695652173913, 10.8695652173913, 10.8695652173913, 
10.8695652173913, 10.6382978723404, 10.6382978723404, 10.6382978723404, 
10.6382978723404, 10.6382978723404, 10.6382978723404, 10.6382978723404, 
10.4166666666667, 10.4166666666667, 10.4166666666667, 10.4166666666667, 
10.4166666666667, 10.4166666666667, 10.4166666666667, 10.2040816326531, 
10.2040816326531, 10.2040816326531, 10.2040816326531, 10.2040816326531, 
10.2040816326531, 10.2040816326531, 10, 10, 10, 10, 10, 10, 10
), species = c("Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Complexo Guinardia dactiolosolen", 
"Complexo Rhizosolenia proboscia", "Coscinodiscus", "Guinardia striata", 
"Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", "Coscinodiscus", 
"Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", "Chaetoceros", 
"Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus", "Rhizosolenia robusta", 
"Chaetoceros", "Complexo Guinardia dactiolosolen", "Complexo Rhizosolenia proboscia", 
"Coscinodiscus", "Guinardia striata", "Hemidiscus"), spectrum = c(19458.7601688054, 
6017.54670807875, 13875.798895155, 159677.693338565, 207621691.203773, 
3811.69914489559, 136847.001892711, 14136.4255054037, 8441.65460457696, 
17393.0496685474, 107116.8751723, 158729101.553218, 2899.61406378871, 
109367.088430288, 9305.87807895499, 11281.5424641351, 18948.4670111303, 
60778.6363304813, 110444279.289477, 2115.32504891347, 82832.8053335067, 
6763.38451479777, 13121.2658179849, 18038.6267765227, 33607.4069291795, 
75631502.7582584, 1728.22087051592, 59272.5054559436, 6245.44059256122, 
13042.9317151286, 16194.4712529523, 18396.0869589645, 50308298.062295, 
1682.59037360351, 36077.8485929601, 6664.13511764911, 11586.486922396, 
14461.3639703533, 8618.02341292554, 30104857.8183676, 1829.55470236216, 
17444.1303666995, 6943.30907874546, 10065.8055812394, 12890.3342129596, 
3320.87177567782, 15728226.1750519, 1997.19168305309, 7496.86737007204, 
6494.49699262939, 8991.0442206116, 11273.6894319914, 1409.95460606118, 
7474051.51038637, 2055.47181627523, 3904.59296499914, 5411.21374815554, 
8009.43677697422, 9683.94295013324, 905.039269264689, 3534969.07308381, 
1969.74548519321, 2645.51718725985, 4213.53795956001, 6835.45158354146, 
8278.78258243896, 809.368222992939, 2019242.74949445, 1773.49233642477, 
2059.75611657007, 3447.71406634804, 5514.59631583194, 7086.85296659687, 
1029.00452520719, 1748319.38289315, 1534.69975564511, 1742.58835496923, 
3298.89669166208, 4231.48378350386, 6140.87287688144, 1589.99915823864, 
2302513.10644475, 1326.22111477987, 1460.83520829073, 3453.91772758991, 
3158.61443762274, 5403.37676725542, 2240.58170330882, 3758051.98565151, 
1189.17261885366, 1309.15805660222, 3504.63655589661, 2329.69936849746, 
4638.76554233306, 2587.82683410599, 6051426.94566691, 1125.88097909571, 
1506.42753971472, 3366.15728607311, 1692.67745433697, 6329281.44510128, 
465.097127046975, 2332.26971428103, 1148.91429609005, 1010.16428069083, 
1144.84760062549, 835.868490459267, 11786388.5541659, 580.540902458, 
4227.58085316718, 2069.70395083785, 1169.22909717042, 1528.89701387316, 
1177.81644915265, 17939351.822906, 768.324134796673, 8384.20576538291, 
3363.84036374411, 1328.77444763696, 1929.79301008027, 1603.80944005807, 
22072551.8733814, 939.826334041237, 13509.5531888272, 4302.05768271601, 
1333.90350144186, 2156.0968317067, 1782.90206768143, 22872261.5594672, 
1014.72869785231, 16247.7050605495, 4312.08542109906, 1201.00422830325, 
2016.3545817191, 1475.80311455503, 20605683.0392986, 987.729636677563, 
14326.6597963028, 3502.82884380579, 1068.22635801264, 1584.23902130377, 
885.52098211917, 16154018.9493131, 884.051415624282, 9403.97952840475, 
2432.21957973094, 1028.44586255351, 1112.2741035284, 425.350674116441, 
10888238.7624687, 737.604849745358, 5015.21428958028, 1617.83384179819, 
1092.19500833427, 775.417959531656, 262.796338903405, 6523946.78994595, 
619.444152461479, 2774.06615995364, 1229.32301921223, 1179.37390691533, 
611.832123456465, 270.500063450411, 3935359.27292958, 577.576157910486, 
1970.68839372538, 1097.61778471231, 1169.79680158148, 585.861605900478, 
306.461937341907, 2636434.34133975, 570.791954699915, 1546.33435152781, 
1017.04207010564, 1038.0403368466, 615.924290592657, 384.364356095856, 
1844089.45693978, 543.408580746617, 1160.181496196, 948.708595803658, 
857.592200250135, 610.549574570753, 573.52359517127, 1330983.85449444, 
501.889526739985, 892.119746535025, 920.320333398857, 693.36507826827, 
542.752570779926, 823.329956595525, 1143325.45509701, 465.154910154485, 
791.361592662822, 912.835866807245, 575.95823079491, 454.877305733286, 
992.242337199621, 1157490.54714983, 423.839059200258, 826.196612794713
)), row.names = c(NA, -201L), class = c("tbl_df", "tbl", "data.frame"
))

And I have the following code to plot:

ggplot(df_spectral) +
  geom_line(aes(x = x, y = spectrum, col = species), size = 1) +
  geom_point(aes(x = x, y = spectrum), col = "black", size = .03) +
  facet_wrap(~species, scales = "free_y") +
  scale_x_continuous("x", n.breaks = 10) +
  labs(x = "µHz") +
  theme_test()

However, I trying to add a secondary x-axis (column period) in a reverse way, below the main x-axis (column x), that is a frequency in µHz.

I don't to do this.

How could I perform this?


Solution

  • To add a secondary axis you need to first determine the two axis scales' ratios so that the 2nd is displayed in an equal axis length. In the code below that ratio is variable fac. Then, sec_axis will use that ratio to have the 2nd axis proportional to its values with ./fac. Function rev reverses the numbers.

    library(ggplot2)
    library(dplyr)
    #> 
    #> Attaching package: 'dplyr'
    #> The following objects are masked from 'package:stats':
    #> 
    #>     filter, lag
    #> The following objects are masked from 'package:base':
    #> 
    #>     intersect, setdiff, setequal, union
    
    (fac <- with(df_spectral, range(x)/range(period)) |> max())
    #> [1] 0.05555556
    
    df_spectral %>%
      mutate(species = gsub(" ", "\n", species)) %>%
      ggplot(aes(x = x, y = spectrum)) +
      geom_line(aes(color = species), linewidth = 1) +
      geom_point(color = "black", size = .03) +
      facet_wrap(~species, scales = "free_y") +
      scale_x_continuous(
        n.breaks = 10,
        sec.axis = sec_axis(~ rev(./fac), name = "period")
      ) +
      labs(x = "µHz") +
      theme_test()
    

    Created on 2024-07-04 with reprex v2.1.0


    Edit

    After @VinceGreg's comments 1 and 2, I think he is probably right, period is the inverse of frequency. But I am not getting his 277.77 factor, fac2 below is computed from the data and is 2.777.

    (fac2 <- with(df_spectral, x/period) |> max())
    #> [1] 2.777778
    
    df_spectral %>%
      mutate(species = gsub(" ", "\n", species)) %>%
      ggplot(aes(x = x, y = spectrum)) +
      geom_line(aes(color = species), linewidth = 1) +
      geom_point(color = "black", size = .03) +
      facet_wrap(~species, scales = "free_y") +
      scale_x_continuous(
        n.breaks = 10,
        sec.axis = sec_axis(~ rev(fac2*.), name = "period")
      ) +
      labs(x = "µHz") +
      theme_test()
    

    Created on 2024-07-04 with reprex v2.1.0