【问题标题】:How to plot x-axis labels and bars between tick marks in ggplot2 bar plot?如何在ggplot2条形图中绘制刻度线之间的x轴标签和条形?
【发布时间】:2017-10-30 12:29:10
【问题描述】:

我准备了一个 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 设置用户定义的中断(作为因素),但它只会让我的刻度和标签完全消失。

非常感谢任何帮助!

【问题讨论】:

  • 我不清楚您希望刻度和标签出现在哪里 - 在组之间?组之间只有两个地方,但您有 3 个刻度/标签。你能以某种方式展示它吗?
  • 刻度应该“框定”每个组的标签,类似于 Henrik 在他的回答中尝试的。虽然比标签多一个刻度来显示一个在零(非常左边)和一个在 x 轴的末端(非常右边)会很好......

标签: r ggplot2 axis-labels


【解决方案1】:

一种选择是将离散的 x 比例转换为连续的,以便于计算 break 位置:

# numeric version of x values
data$x <- as.integer(as.factor(data$name))

1。 x 柱组之间的刻度

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))))


2:在柱状组之前、之间和之后的 x 个刻度

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的额外网格线...

【讨论】:

  • 谢谢,Henrik,我会用我稍微复杂的数据试试看 ;-) 而且我不关心垂直网格线,因为无论如何我都会让它们消失。
  • @Johanna 我注意到您对您的问题的评论并相应地更新了我的答案。
  • 我的需要一个小改动,element_line(color = c(rep(NA, len) 而不是 len - 1
【解决方案2】:

这是另一个使用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)

这将显示警告。这是因为拆分的数量不同。

【讨论】:

  • 不幸的是,刻度并不完全位于中间。这可以在 unit() 中轻松调整。我现在没有时间找到通用解决方案。可以稍后编辑。
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2020-12-01
  • 1970-01-01
相关资源
最近更新 更多