Search code examples
rggplot2plotaxisxticks

ggplot: Adding a plot outline with the axis ticks


I'm trying to create plots where the x-axis ALSO appears above the plot as well as the y-axis to the right of the plot. Both should contain the same ticks as the normal axis, but NOT the axis text. This should result in a "box" with helpful tick-marks around the plot. I would also like to have smaller ticks in-between my major ticks (that are labelled) that do not have a label. Here is a figure I made:

Plot as it is now

I also drew in pink what I would like to achieve in R:

Plot as I would like it]3

My code for this plot:

p <- p + xlab("") + ylab("") + theme(legend.position = "none") + theme(axis.ticks.length = unit(-0.25, "cm"), axis.text.x = element_text(size = 30, hjust=1)) + theme(axis.text.y = element_text(size=35, hjust = 1), strip.text = element_text(size=35), axis.title.y = element_text(size = 40), legend.text = element_text(size=30), axis.title.x = element_text(size=40), legend.title = element_text(size=45)) 
p <- p + theme(text = element_text(family = "Helvetica")) + scale_x_continuous(limits=c(-0.5, 25), breaks = c(0, 2, 4, 6, 8, 24))  + theme(legend.background = element_rect(color = "black", linetype = "solid")) + scale_colour_manual(values = cbpallette)
p <- p + theme(legend.key.size = unit(2.5, "cm")) + theme(axis.text.x = element_text(margin = margin(t = .5, unit = "cm")), axis.text.y = element_text(margin = margin(r = .5, unit = "cm")))
p

*** Edit *** Here is updated code, using Stefans advise. The figure looks like so, the ticks are there, the axis are missing:

updated figure

p <- p + xlab("") + ylab("") + theme(legend.position = "none") + theme(axis.ticks.length = unit(-0.25, "cm"), axis.text.x = element_text(size = 30, hjust=1)) + theme(axis.text.y = element_text(size=35, hjust = 1, angle=45), strip.text = element_text(size=35), axis.title.y = element_text(size = 40), legend.text = element_text(size=30), axis.title.x = element_text(size=40)) 
p <- p + theme(text = element_text(family = "Helvetica"))  + scale_colour_manual(values = cbpallette)
p <- p + theme(axis.text.x = element_text(margin = margin(t = .5, unit = "cm")), axis.text.y = element_text(margin = margin(r = .5, unit = "cm"))) 
p

Solution

  • You could duplicate the axes using argument sec.axis = dup_axis() for both scales like so:

    library(ggplot2)
    
    ggplot(mtcars, aes(hp, mpg)) +
      geom_point() +
      scale_x_continuous(sec.axis = dup_axis(name = NULL, labels = NULL)) +
      scale_y_continuous(sec.axis = dup_axis(name = NULL, labels = NULL))