Search code examples
rggplot2geom-baraesthetics

How do I correct the scale and order of the y axis in R on a barplot


Working with borehole data, attempting to plot the cross section with R. I'm rusty and am having trouble organizing the plot the way I want. From the image, my bar plot is not tracking with y axis values displaying the depth of the borehole, instead it tracks with the Layers (categorical data).

Very similar question was asked here but I could not get the code to work for my situation because my data is formatted differently.

Just to clarify, I want to put the y axis in increasing numerical order, starting at 0, with the categorical layer data mapped to the correct part of that depth.

my code:

g2 <- ggplot(data=df3,
        mapping = aes(x=PointID,y=End_Depth,
                      fill=`Layer`)) +
  geom_col(colour="black") +
  labs(y="Depth")

How the Chart Turns Out Now

The Data


Solution

  • The question you were pointing to contains a very good idea, to use geom_rect instead. You could do something like the following (comments in code)

    library(tidyverse)
    
    # just some fake data, similar to yours
    foo <- data.frame(id = "id", layer = letters[1:6], depth = c(5,10,12,15,20,25))
    
    foo2 <- 
      foo %>%
      # using lag to create ymin, which is needed for geom_rect
      # transforming id into integers so i can add / subtract some x for xmin/xmax
      mutate( ymin = lag(depth, default = 0),
             id_int = as.integer(factor(id))) 
      
    # I am turning off the legend and labelling the layers directly instead 
    # using geom_text
    # this creates a "wrong" y axis title which I'm changing with labs(y = ... )
    # the continuous x axis needs to be turned into a fake discrete axis by
    # semi-manually setting the breaks and labels
    ggplot(foo2) +
      geom_rect(aes(xmin = id_int - .5, xmax = id_int +.5, 
                    ymin = ymin, ymax = depth,
                    fill = layer), show.legend = FALSE) +
      geom_text(aes(x = id_int, y = (depth + ymin)/2, label = layer)) +
      scale_x_continuous(breaks = foo2$id_int, labels = foo2$id) +
      labs(y = "depth") 
    

    Created on 2021-10-19 by the reprex package (v2.0.1)