I prepared a MWE and hope for help on how to set ticks and labels at different position on the x-axis for a grouped bar plot.
library(ggplot2)
library(reshap
One options would be to convert the discrete x scale to continuous, to facilitate calculation of break
positions:
# numeric version of x values
data$x <- as.integer(as.factor(data$name))
x_tick <- head(unique(data$x), -1) + 0.5
len <- length(x_tick)
ggplot(data, aes(x = x, y = value, fill = variable)) +
geom_col(position = "dodge") +
scale_x_continuous(breaks = c(sort(unique(data$x)), x_tick),
labels = c(sort(unique(data$name)), rep(c(""), len))) +
theme(axis.ticks.x = element_line(color = c(rep(NA, len + 1), rep("black", len))))
x_tick <- c(0, unique(data$x)) + 0.5
len <- length(x_tick)
ggplot(data, aes(x = x, y = value, fill = variable)) +
geom_col(position = "dodge") +
scale_x_continuous(breaks = c(sort(unique(data$x)), x_tick),
labels = c(sort(unique(data$name)), rep(c(""), len))) +
theme(axis.ticks.x = element_line(color = c(rep(NA, len - 1), rep("black", len))))
Don't ask me about the additional grid lines which appeared at 2.25 and 1.75 respectively...
Here is another solution which uses grid
package.
library(grid)
nTicks <- 2
tickersPosition <- unit(rep(1:nTicks /(nTicks+1), each=2), "native")
Part 1:nTicks /(nTicks+1)
identifies positions where ticks will be placed.
p1 <- ggplot(data, aes(name,value)) +
geom_bar(aes(fill = variable), position = "dodge", stat = "identity")
To change position of ticks we need to create gtable
p2 <- ggplot_gtable(ggplot_build(p1))
and find the right grob (using str
):
p2$grobs[[7]]$children$axis$grobs[[1]]$x <- tickersPosition
After the position is rewritten, we can run
grid::grid.draw(p2)
which will show warnings. This is because of a different number of splits.