考虑这个简单的例子
implicit classes must accept exactly one primary constructor parameter
看看这些条与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
的栏中居中?我怎样才能控制它?例如,对我来说,更有意义的是让标签从标签的右边开始。
谢谢!
答案 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)
您可以将0.5
添加到number
,将栏移到整数的右侧:
ggplot(data, aes(x = number + 0.5)) + geom_bar() + scale_x_continuous(breaks = 1:16)
如果你想使用直方图,你可以让ggplot使用更合理的箱子,如下所示:
ggplot(data, aes(x = number)) +
geom_histogram(binwidth = 1, boundary = 0, closed = "left") +
scale_x_continuous(breaks = 1:16)
使用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)
。答案 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)
}
请访问以下链接以查看与视频相同的方法,如果有帮助,请点赞: 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())。