4

我想绘制我的数据的直方图以显示其分布,但与大多数值相比,我有一些异常值非常高,它们 < 1.00。而不是在最左边有一个或两个条形图,然后直到图表的最右边什么都没有,我想要一个直方图,其中包含异常值之外的所有内容,然后在标签的末尾添加一个条形图在它下面是“>100%”。我可以使用 ggplot2 使用 geom_bar() 来做到这一点,如下所示:

 X <- c(rnorm(1000, mean = 0.5, sd = 0.2), 
   rnorm(10, mean = 10, sd = 0.5))
 Data <- data.frame(table(cut(X, breaks=c(seq(0,1, by=0.05), max(X)))))

 library(ggplot2)
 ggplot(Data, aes(x = Var1, y = Freq)) + geom_bar(stat = "identity") +
  scale_x_discrete(labels = paste0(c(seq(5,100, by = 5), ">100"), "%"))

直方图 问题是,对于我需要的尺寸,标签最终会重叠或需要以一定角度绘制以提高可读性。我真的不需要标记所有的酒吧。有没有办法

  • A) 以不同于 geom_bar() 的方式绘制它,这样我就不需要手动添加最后一个条或
  • B) 只标注一些吧?
4

1 回答 1

2

我会试着回答B。

我不知道是否有一个参数可以让你这样做 B) 但你可以手动定义一个函数来为你做这件事。IE:

library(ggplot2)
X <- c(rnorm(1000, mean = 0.5, sd = 0.2), 
       rnorm(10, mean = 10, sd = 0.5))
Data <- data.frame(table(cut(X, breaks=c(seq(0,1, by=0.05), max(X)))))

#the function will remove one label every n labels
remove_elem <- function(x,n) {
  for (i in (1:length(x))) {
    if (i %% n == 0) {x[i]<-''}
  }  
  return(x)  
}

#make inital labels outside ggplot (same way as before). 
labels <-paste0(c(seq(5,100, by = 5),'>100'),'%')

现在在 ggplot 函数中使用该函数:

ggplot(Data, aes(x = Var1, y = Freq)) + geom_bar(stat = "identity") +
  scale_x_discrete(labels = remove_elem(labels,2))

输出:

在此处输入图像描述

我不知道这是否是您正在寻找的东西,但它可以解决问题!

于 2014-10-28T20:22:32.160 回答