如何更改Barplot中的ggplot2 x轴值?

时间:2019-04-07 20:47:16

标签: r ggplot2

我想在R中绘制一个小节,其中图形中的最后一个小节表示last是所有频率大于某个阈值的所有值的总和。我想用对应于最后一个小节的x值表示此信息。例如:

library(ggplot2)

x <- c(1, 2, 3, 4, 5)
y <- c(4000, 3000, 2000, 1000, 500)

df <- data.frame(x, y)

names(df) <- c("Var1", "Freq")

theme_set(theme_classic())

g <- ggplot(df, aes(Var1, Freq))
g + geom_bar(stat = "identity", width = 0.5, fill = 'tomato2') + 
  xlab('Var1') +
  ylab('Freq') +
  theme(axis.text.x = element_text(angle = 0, 
                                   vjust = 0.6, 
                                   colour = "black"),
        axis.text.y = element_text(colour = "black"))

上面的代码生成类似于此的图表:

enter image description here

但是在最后一个栏中,我希望x轴(x = 5)的最后一个值显示为>= 5

到目前为止,我已经尝试使用scale_x_discrete。所以我在上面的代码中添加了以下几行:

n <- 5

# I'm not very creative with names.
.foo <- function(x, n) {
  if (x == n) {
    element <- paste('\u2265', toString(x), sep = ' ')
  } else {
    element <- toString(x)
  }
}

labels <- sapply(seq(n), .foo, n)

g + scale_x_discrete(breaks = sapply(seq(n), function(x) toString(x)),
                     labels = labels)

此代码可以按我希望的方式设置x轴的格式,但它会覆盖小节图,并留下一个空图表:

enter image description here

我该怎么做?

3 个答案:

答案 0 :(得分:2)

更改scale_x_continuous中的标签:

... + scale_x_continuous(labels=c("0", "1", "2", "3", "4", "\u2265 5"))

plot

答案 1 :(得分:1)

一种方法是避免直接更改轴刻度标签,而是将Var1中的分类数据转换为一个因数,然后使用forcats::fct_lump重新调整该因数,使最终因数为{{1 }}

≥5

答案 2 :(得分:0)

问题是,正如@ Z.Lin注释所指出的那样,在使用geom_bar(...)之前,我已将scale_x_discret分配给ggplot对象。解决方法如下:


library(ggplot2)
  ...
  labels <- sapply(seq(n), .foo, n)

  g <- ggplot(df, aes(Var1, Freq)) + 
         scale_x_discrete(breaks = sapply(seq(n), function(x) toString(x)),
                          labels = labels)

  g + geom_bar(stat = "identity", width = 0.5, fill = color) + 
  ...