R语言 使用ggplot2时,我可以设置直方图条形的颜色而不可能模糊低值吗?

p1tboqfb  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(156)

当使用colorfill参数调用geom_histogram()时,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))

将导致

这在视觉上很不吸引人。为了解决这个问题,我想使用

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

这将导致

问题是,我无法区分exectime是否包含大于10的值,例如,12的几次出现会隐藏在横跨整个x轴的水平线后面。

pvabu6sv

pvabu6sv1#

使用coord_cartesian代替scale_x_continuouscoord_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")

如上图所示,如果在数据范围 * 内存在count=0 * 的柱形图,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")

另一种选择是使用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)

wpx232ag

wpx232ag2#

另一个选择是在y aes中使用after_stat来检查绘制的值是否大于0,否则它将被替换为NA以确保它从直方图中删除。这样就可以在直方图中看到小值和零之间的差异,如下图所示(数据来自@eipi10):

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

library(ggplot2)
ggplot(dat, aes(x = value,
                y = ifelse(after_stat(count) > 0, after_stat(count), NA))) +
  geom_histogram(binwidth=0.5, color="black", fill="grey") + 
  theme_bw() +
  scale_x_continuous(limits=c(5,25), breaks=5:25)

创建于2023年2月15日,使用reprex v2.0.2
如您所见,较小值与0之间存在差异。

相关问题