使用ggplot2时,我是否可以设置直方图条的颜色而不会隐藏低值?

yup*_*ity 6 r ggplot2

geom_histogram()使用colorfill参数调用时,ggplot2会混淆地绘制整个x轴范围,从而无法在视觉上区分低值和零值.

运行以下代码:

ggplot(esubset, aes(x=exectime)) + geom_histogram(binwidth = 0.5) +
theme_bw() + scale_x_continuous(breaks=seq(0,20), limits=c(0,20))
Run Code Online (Sandbox Code Playgroud)

会导致

没有颜色属性的直方图

这在视觉上非常没有吸引力.为了解决这个问题,我想改为使用

ggplot(esubset, aes(x=exectime)) + geom_histogram(binwidth = 0.5,
colour='black', fill='gray') + theme_bw() +
scale_x_continuous(breaks=seq(0,20), limits=c(0,20))
Run Code Online (Sandbox Code Playgroud)

这将导致

带有颜色属性的直方图

问题是我无法区分是否exectime包含超过10的值,例如,少数几次出现的12将隐藏在跨越整个x轴的水平线后面.

eip*_*i10 6

coord_cartesian而不是scale_x_continuous.coord_cartesian设置轴范围而不影响数据的绘制方式.即使使用coord_cartesian,您仍然可以使用scale_x_continuous设置breaks,但coord_cartesian会覆盖scale_x_continuous数据绘制方式的任何影响.

在下面的假数据中,请注意我已经添加了一些非常小的条形数据.

set.seed(4958)
dat = data.frame(value=c(rnorm(5000, 10, 1), rep(15:20,1:6)))

ggplot(dat, aes(value)) +
  geom_histogram(binwidth=0.5, color="black", fill="grey") + 
  theme_bw() +
  scale_x_continuous(limits=c(5,25), breaks=5:25) + 
  ggtitle("scale_x_continuous")

ggplot(dat, aes(value)) +
  geom_histogram(binwidth=0.5, color="black", fill="grey") + 
  theme_bw() +
  coord_cartesian(xlim=c(5,25)) + 
  scale_x_continuous(breaks=5:25) +
  ggtitle("coord_cartesian")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

正如您在上面的图中所看到的,如果数据范围内有count = 0的bin ,ggplot将添加一个零线,即使是coord_cartesian.这使得很难看到高度为15的条形码= 1.您可以使用lwd参数("linewidth")使边框更薄,以便较小的条纹不会变得模糊:

ggplot(dat, aes(value)) +
  geom_histogram(binwidth=0.5, color="black", fill="grey", lwd=0.3) + 
  theme_bw() +
  coord_cartesian(xlim=c(5,25)) + 
  scale_x_continuous(breaks=5:25) +
  ggtitle("coord_cartesian")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

另一个选择是预先汇总数据和使用绘图geom_bar,以便在条形之间获得空格,从而避免使用边框线来标记条形边缘:

library(dplyr)
library(tidyr)
library(zoo)

bins = seq(floor(min(dat$value)) - 1.75, ceiling(max(dat$value)) + 1.25, 0.5)

dat.binned = dat %>% 
  count(bin=cut(value, bins, right=FALSE)) %>%   # Bin the data
  complete(bin, fill=list(n=0)) %>%              # Restore empty bins and fill with zeros
  mutate(bin = rollmean(bins,2)[-length(bins)])  # Convert bin from factor to numeric with value = mean of bin range

ggplot(dat.binned, aes(bin, n)) +
  geom_bar(stat="identity", fill=hcl(240,100,30)) + 
  theme_bw() +
  scale_x_continuous(breaks=0:21)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述