ggplot2:如何将直方图的条与x轴对齐?

时间:2017-01-05 13:11:44

标签: r ggplot2

考虑这个简单的例子

implicit classes must accept exactly one primary constructor parameter

enter image description here

看看这些条与x轴奇怪对齐?为什么library(ggplot2) dat <- data.frame(number = c(5, 10, 11 ,12,12,12,13,15,15)) ggplot(dat, aes(x = number)) + geom_histogram() 左侧的第一个栏位于5.0的栏中居中?我怎样才能控制它?例如,对我来说,更有意义的是让标签从标签的右边开始。

谢谢!

4 个答案:

答案 0 :(得分:13)

为什么酒吧“奇怪地对齐”?

首先让我解释一下,为什么你的代码会导致奇怪的对齐条形。这与构建直方图的方式有关。首先,将x轴分成间隔,然后计算每个间隔中的值的数量。

默认情况下,ggplot会将数据拆分为30个分箱。它甚至吐出一条信息:

  

stat_bin()使用bins = 30。使用binwidth选择更高的价值。

默认数量并不总是一个不错的选择。在您的情况下,所有数据点都是整数,可能希望选择二进制位的边界为5, 6, 7, 8, ...4.5, 5.5, 6.5, ...,这样每个bin只包含一个整数值。您可以按如下方式获取绘图中使用的区域的边界:

data <- data.frame(number = c(5, 10, 11 ,12, 12, 12, 13, 15, 15))
p <- ggplot(data, aes(x = number)) + geom_histogram()
ggplot_build(p)$data[[1]]$xmin
##  [1]  4.655172  5.000000  5.344828  5.689655  6.034483  6.379310  6.724138  7.068966  7.413793
## [10]  7.758621  8.103448  8.448276  8.793103  9.137931  9.482759  9.827586 10.172414 10.517241
## [19] 10.862069 11.206897 11.551724 11.896552 12.241379 12.586207 12.931034 13.275862 13.620690
## [28] 13.965517 14.310345 14.655172

正如您所看到的,区块的边界的选择方式不会导致条形与整数的良好对齐。

因此,简而言之,奇怪对齐的原因是ggplot只使用默认数量的30个二进制位,在您的情况下,不适合使用与整数很好地对齐的条。< / p>

有(至少)两种方法来获得很好的对齐条形,我将在下面讨论

使用条形图

由于您有整数数据,因此直方图可能不是可视化的合适选择。您可以改为使用geom_bar(),这将导致以整数为中心的条形码:

ggplot(data, aes(x = number)) + geom_bar() + scale_x_continuous(breaks = 1:16)

enter image description here

您可以将0.5添加到number,将栏移到整数的右侧:

ggplot(data, aes(x = number + 0.5)) + geom_bar() + scale_x_continuous(breaks = 1:16)

enter image description here

使用适当的箱子

创建直方图

如果你想使用直方图,你可以让ggplot使用更合理的箱子,如下所示:

ggplot(data, aes(x = number)) +
  geom_histogram(binwidth = 1, boundary = 0, closed = "left") +
  scale_x_continuous(breaks = 1:16)

enter image description here

使用binwidth = 1,您可以覆盖默认选项30个分区,并明确要求分区宽度为1. boundary = 0确保分箱以整数值开始,这是您需要的,如果你想将整数放在条形的左边。 (如果省略它,则选择条形图使条形图以整数为中心。)

论证closed = "left"解释起来有点棘手。如上所述,现在选择箱的边界为5, 6, 7, ...。现在的问题是,例如6应该是哪个bin?它可以是第一个也可以是第二个。这是由closed控制的选择:如果将其设置为"right"(默认值),则会在右侧关闭分档,这意味着将包含分箱的右边界,而左边界属于左边的垃圾箱。所以,6将在第一个bin中。另一方面,如果您选择"left",则左边界将成为bin的一部分,而6将位于第二个bin中。

由于您希望条形图位于整数的左侧,因此您需要选择closed = "left"

两种解决方案的比较

如果您将直方图与条形图进行比较,您会发现两个不同之处:

  • 条形图中的条形之间有一点间隙,而它们在直方图中触摸。您可以使用geom_bar(width = 1)
  • 使条形图触及前者
  • 条形图最右边的条形图在15到16之间,而直方图条形图则在14到15之间。原因是虽然对于所有箱子,只有左边界是箱子的一部分,而对于最右边的箱子,两个边界都包括在内。

答案 1 :(得分:4)

这会使条形中心值

data <- data.frame(number = c(5, 10, 11 ,12,12,12,13,15,15))
ggplot(data,aes(x = number)) + geom_histogram(binwidth = 0.5)

这是一个带有刻度标签的技巧,可以让左边的条形对齐。 但是如果你添加其他数据,你也需要改变它们

ggplot(data,aes(x = number)) + 
  geom_histogram(binwidth = 0.5) + 
  scale_x_continuous(
    breaks=seq(0.75,15.75,1), #show x-ticks align on the bar (0.25 before the value, half of the binwidth) 
    labels = 1:16 #change tick label to get the bar x-value
    )

其他选项:binwidth = 1, breaks=seq(0.5,15.5,1)(可能对整数更有意义)

答案 2 :(得分:0)

newgoat <- character()
for (row in 1:seq_along(targlist$target)) {
  newgoat <- gsub(targlist$target, targlist$replacement, goats)
} 

enter image description here

请访问以下链接以查看与视频相同的方法,如果有帮助,请点赞: https://www.youtube.com/watch?v=Za8bTDvmPLk

通过使用这种方法,我们不需要手动计算 bin 详细信息。如有问题请评论。

答案 3 :(得分:-1)

这对我有用

+ scale_x_continuous(limits = c(0, NA)) 

?scale_x_continuous中,limits是:

其中之一:

  • NULL以使用默认比例范围

  • 长度为2的数字矢量,提供了刻度的极限。使用NA 引用现有的最低或最高

  • 接受现有(自动)限制并返回的函数 新的限制请注意,设置位置刻度的限制将被删除 超出限制的数据。如果目的是缩放,请使用限制 坐标系中的参数(请参阅coord_cartesian())。