Add axis label labels on top and right on ggplot?

In the base graph, we can easily add label marks on different sides of the graph using the axis and side arguments:

 par(tck = 0.025) plot(1:10) axis(side = 3, labels = FALSE) axis(side = 4, labels = FALSE) 

How can I mark checkmarks x and y on top and right in ggplot2 ? There is annotation_logticks that can do this, but it only seems to work well for logarithmic scales (since the function name is used). For linear scales, is there such an easy way?

+3
source share
2 answers

This reflects the marks by type of axis (using the gtable functions) and places the marks in the result pane.

EDIT April 18, 2016 axis.ticks.margin deprecated. Use text fields instead.

EDIT 19 Moments. 2015 : Better Tag Positioning

 library(ggplot2) # v2.1.0 library(gtable) # v0.2.0 library(grid) # Get a plot p = ggplot(data.frame(x = 1:10, y = 1:10), aes(x,y)) + geom_point() + theme_bw() + theme(panel.grid = element_blank(), axis.ticks.length=unit(-0.25, "cm"), axis.text.x = element_text(margin = margin(t = .5, unit = "cm")), axis.text.y = element_text(margin = margin(r = .5, unit = "cm"))) # Convert the plot to a grob gt <- ggplotGrob(p) # Get the position of the panel in the layout panel <-c(subset(gt$layout, name=="panel", se=t:r)) ## For the bottom axis # Get the row number of the bottom axis in the layout rn <- which(gt$layout$name == "axis-b") # Extract the axis (tick marks only) axis.grob <- gt$grobs[[rn]] axisb <- axis.grob$children[[2]] # Two children - get the second axisb # Note: two grobs - tick marks and text # Get the tick marks xaxis = axisb$grobs[[1]] # NOTE: tick marks first xaxis$y = xaxis$y - unit(0.25, "cm") # Position them inside the panel # Add a new row to gt, and insert the revised xaxis grob into the new row. gt <- gtable_add_rows(gt, unit(0, "lines"), panel$t-1) gt <- gtable_add_grob(gt, xaxis, l = panel$l, t = panel$t, r = panel$r, name = "ticks") ## Repeat for the left axis # Get the row number of the left axis in the layout panel <-c(subset(gt$layout, name=="panel", se=t:r)) rn <- which(gt$layout$name == "axis-l") # Extract the axis (tick marks and axis text) axis.grob <- gt$grobs[[rn]] axisl <- axis.grob$children[[2]] # Two children - get the second axisl # Note: two grobs - text and tick marks # Get the tick marks yaxis = axisl$grobs[[2]] # NOTE: tick marks second yaxis$x = yaxis$x - unit(0.25, "cm") # Position them inside the panel # Add a new column to gt, and insert the revised yaxis grob into the new column. gt <- gtable_add_cols(gt, unit(0, "lines"), panel$r) gt <- gtable_add_grob(gt, yaxis, t = panel$t, l = panel$r+1, name = "ticks") # Turn clipping off gt$layout[gt$layout$name == "ticks", ]$clip = "off" # Draw it grid.draw(gt) 

enter image description here

+4
source

From ggplot2 2.2.0 you can use the argument sec.axis in scale_ .

dup_axis is an abbreviation for creating a secondary axis, which is a duplication of the primary axis, effectively reflecting the primary axis.

 ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + scale_x_continuous(sec.axis = dup_axis()) + scale_y_continuous(sec.axis = dup_axis()) 

enter image description here

+9
source

All Articles