Home > Blockchain >  How do you recenter y-axis at 0.01 using ggplot2
How do you recenter y-axis at 0.01 using ggplot2

Time:02-11

I am trying to make a grouped bar plot comparing the concentration of contaminants (in ug/g) from 2 different locations site comparison figure, with the y axis in log scale. I have some values that are below one but greater than zero. The y axis is centering my bars at y=1, making some of the bars look negative. Is there to make my bars start at 0.01 instead of 1?

enter image description here

I tried coord_cartesian( ylim=c(0.01,100), expand = FALSE ) but that didn't do it. I also tried to use coor_trans(y='log10') to log transform y axis instead of scale_y_continuous(trans='log10') but was getting the error message "Transformation introduced infinite values in y-axis" even though I have no zero values.

Any help would be much appreciated, Thank you.

my code is below:

malcomp2 %>% 
  ggplot(aes(x= contam, y= ug_values, fill= Location)) 
  geom_col(data= malcomp2,
           mapping = aes(x= contam, y= ug_values, fill = Location),
           position = position_dodge(.9), #makes the bars grouped
           stat_identity(),
           colour = "black", #adds black lines around bars
           width = 0.8,
           size = 0.3) 
  ylab(expression(Concentration~(mu*g/g)))  #adds mu character to y axis
  coord_cartesian( ylim=c(0.01,100), expand = FALSE )    #force bars to start at 0
  theme_classic()  #get rid of grey grid
  scale_y_continuous(trans='log10',   #change to log scale
                     labels = c(0.01,0.1,1,10,100))  #change axis to not sci notation
  annotation_logticks(sides = 'l')     #add log ticks to y axis only
  scale_x_discrete(name = NULL, #no x axis label
                   limits = c('Dieldrin','Mirex','PBDEs','CHLDs','DDTs','PCBtri','PCBquad',
                            'PCBhept'),   #changes order of x axis
                   labels = c('Dieldrin','Mirex','PBDEs','CHLDs','DDTs','PCB 3','PCB 4-6','PCB7 '))    
  scale_fill_manual("Location",      #rename legend
                    values = c('turquoise2','gold'),  #change colors
                    labels = c( 'St.Andrew Bay', 'Sapelo'))   #change names on legend
  theme(legend.title = NULL,
        legend.key.size = unit(15, "pt"),
        legend.position =   c(0.10,0.95))   #places legend in upper left corner

CodePudding user response:

One hack would be to just scale your data so baseline is at 1. People have asked this question before on SO, and it seems like a more satisfactory approach might be to use geom_rect instead, like here:

enter image description here

  • Related