Denis
Denis

Reputation: 151

Readjusting the horizontal axis in ggplot

I have a simple dataset, containing values from 0 to 1. When I plot it, naturally, the horizontal axis is zero. I would like this reference to be 0.5 and the bars falling below 0.5 to be reversed and colored differently than those falling above this threshold.

my.df <- data.frame(group=state.name[1:20],col1 = runif(20))

p <- ggplot(my.df, aes(x=group,y=col1)) +
 geom_bar(stat="identity")+ylim(0,0.5)

I am thinking of dissecting the data into two, one subset being greater than 0.5 and the other being larger than 0.5, then somewhat combining these two subsets in the same ggplot. Is there any other clearer way to do that? Thanks!

Upvotes: 0

Views: 381

Answers (2)

jas_hughes
jas_hughes

Reputation: 56

The y-variable you are trying to communicate is distance from 0.5, so you need to change the values in col1 to reflect this.

library(dplyr)
library(ggplot)
my.df %>% 
  mutate(col2 = col1-0.5) %>% 
  ggplot() +
  aes(x = group, y = col2, fill = col2 >=0) + 
  geom_bar(stat = 'identity') + 
  theme(legend.position = 'none', 
        axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) + 
  ylab('Col1 above 0.5 (AU)')

sample plot

Note, you can also use the aes(fill = col1 >= 0.5) option to color code the bars without shifting the axis (which is what I would recommend if col1 contains percentages).

Upvotes: 0

kstew
kstew

Reputation: 1114

To build on @jas_hughes's answer, you can subtract 0.5 from your col1 variable, then rename the labels on the y-axis.

df <- data.frame(group=state.name[1:20],value=runif(20))

df %>% ggplot(aes(reorder(group,value),value-0.5)) + geom_bar(stat='identity') +
  scale_y_discrete(name='Value',
                   labels=c('0','0.5','1'),
                   limits=c(-0.5,0,0.5),
                   expand = c(-0.55, 0.55)) + 
  xlab('State') + 
  theme(axis.text.x = element_text(angle=45,hjust=1))

bar

Upvotes: 2

Related Questions