我准备了一个MWE并希望得到如何在x轴的不同位置设置刻度和标签以获得分组条形图的帮助。
library(ggplot2)
library(reshape2)
data <- data.frame(name = c("X","Y","Z"), A = c(2,4,6), B = c(1,3,4), C = c(3,4,5))
data <- melt(data, id = 1)
ggplot(data, aes(name,value)) +
geom_bar(aes(fill = variable), position = "dodge", stat = "identity")
刻度线应显示在组之间,但标签位于分组条形下方(如图中所示)。我试图为scale_x_discrete
设置用户定义的中断(作为因子),但它只会让我的刻度和标签完全消失。
非常感谢任何帮助!
答案 0 :(得分:6)
一种选择是将离散x标度转换为连续标度,以便于计算break
位置:
# 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))))
不要问我有关分别出现在2.25和1.75的额外网格线......
答案 1 :(得分:0)
这是另一个使用grid
包的解决方案。
library(grid)
nTicks <- 2
tickersPosition <- unit(rep(1:nTicks /(nTicks+1), each=2), "native")
部分1:nTicks /(nTicks+1)
标识将放置刻度的位置。
p1 <- ggplot(data, aes(name,value)) +
geom_bar(aes(fill = variable), position = "dodge", stat = "identity")
要更改刻度线的位置,我们需要创建gtable
p2 <- ggplot_gtable(ggplot_build(p1))
找到正确的grob(使用str
):
p2$grobs[[7]]$children$axis$grobs[[1]]$x <- tickersPosition
在重写职位后,我们可以运行
grid::grid.draw(p2)
将显示警告。这是因为拆分数量不同。