ggplot2 网格重叠超出边界
gplot2 grids overlap out of boundary
我在[0,1]中统一创建点,每个点都有观测值。但是 ggpolot 显示了一些大于 1 的观测值,这些观测值在边界之外。为什么即使坐标在 0 和 1 范围内也会发生这种情况?你知道如何避免这种情况吗?
x=runif(10^6)
y=runif(10^6)
z=rnorm(10^6)
new.data=data.frame(x,y,z)
library(ggplot2)
ggplot(data=new.data) + stat_summary_2d(fun = mean, aes(x=x, y=y, z=z))
这是一个与用于分箱的网格有关的问题。
让我们用一个更小的例子。
set.seed(42)
x=runif(10^3)
y=runif(10^3)
z=rnorm(10^3)
new.data=data.frame(x,y,z)
library(ggplot2)
(g <- ggplot(data=new.data) +
stat_summary_2d(fun = mean, aes(x=x, y=y, z=z)) +
geom_point(aes(x, y)))
现在让我们放大左上角的那个框
g + coord_cartesian(xlim = c(0.02, 0.075), ylim = c(0.99, 1.035),
expand = FALSE)
如您所见,该框从 y = 1 以下开始但延伸至该值以上
因为您正在根据某些 binwidth 对观察结果进行分箱。
如果使用直方图,也会出现同样的现象。
ggplot(data.frame(x = runif(1000, 0, 1)), aes(x)) +
geom_histogram()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
在 geom_histogram
中,可以通过设置 boundary
参数来避免这种情况
为 0,箱子数量为总长度的倍数。
ggplot(data.frame(x = runif(1000, 0, 1)), aes(x)) +
geom_histogram(boundary = 0, binwidth = 0.1)
所以您的解决方案是将 binwidth 设置为 1/n,其中 n 是
一个整数
ggplot(data=new.data) +
stat_summary_2d(fun = mean, aes(x=x, y=y, z=z), binwidth = 0.1) +
geom_point(aes(x, y))
由 reprex package (v0.2.1.9000)
创建于 2018-11-04
你有:
set.seed(1)
x=runif(10^6)
这是 going on behind the scenes 的内容:
bins <- 30L
range <- range(x)
origin <- 0L
binwidth <- diff(range)/bins
breaks <- seq(origin, range[2] + binwidth, binwidth)
bins <- cut(x, breaks, include.lowest = TRUE, right = TRUE, dig.lab = 7)
table(bins)
# ...
# (0.8999984,0.9333317] (0.9333317,0.9666649] (0.9666649,0.9999982]
# 33217 33039 33297
# (0.9999982,1.033331]
# 1
max(x)
# [1] 0.9999984
How come this can happen even though coordinates are within 0 and 1
range
- binning 从
0
开始(不是最小值)
- 每个 bin 的大小为
binwidth
- 有一个最终的 bin 以最大值 +
binwidth
结束,它获得最大值
Do you have any idea how to avoid this?
一种方法是定义您自己的休息时间:
ggplot(data=new.data) + stat_summary_2d(fun = mean, aes(x=x, y=y, z=z), breaks = seq(0, 1, .1))
我在[0,1]中统一创建点,每个点都有观测值。但是 ggpolot 显示了一些大于 1 的观测值,这些观测值在边界之外。为什么即使坐标在 0 和 1 范围内也会发生这种情况?你知道如何避免这种情况吗?
x=runif(10^6)
y=runif(10^6)
z=rnorm(10^6)
new.data=data.frame(x,y,z)
library(ggplot2)
ggplot(data=new.data) + stat_summary_2d(fun = mean, aes(x=x, y=y, z=z))
这是一个与用于分箱的网格有关的问题。 让我们用一个更小的例子。
set.seed(42)
x=runif(10^3)
y=runif(10^3)
z=rnorm(10^3)
new.data=data.frame(x,y,z)
library(ggplot2)
(g <- ggplot(data=new.data) +
stat_summary_2d(fun = mean, aes(x=x, y=y, z=z)) +
geom_point(aes(x, y)))
现在让我们放大左上角的那个框
g + coord_cartesian(xlim = c(0.02, 0.075), ylim = c(0.99, 1.035),
expand = FALSE)
如您所见,该框从 y = 1 以下开始但延伸至该值以上 因为您正在根据某些 binwidth 对观察结果进行分箱。 如果使用直方图,也会出现同样的现象。
ggplot(data.frame(x = runif(1000, 0, 1)), aes(x)) +
geom_histogram()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
在 geom_histogram
中,可以通过设置 boundary
参数来避免这种情况
为 0,箱子数量为总长度的倍数。
ggplot(data.frame(x = runif(1000, 0, 1)), aes(x)) +
geom_histogram(boundary = 0, binwidth = 0.1)
所以您的解决方案是将 binwidth 设置为 1/n,其中 n 是 一个整数
ggplot(data=new.data) +
stat_summary_2d(fun = mean, aes(x=x, y=y, z=z), binwidth = 0.1) +
geom_point(aes(x, y))
由 reprex package (v0.2.1.9000)
创建于 2018-11-04你有:
set.seed(1)
x=runif(10^6)
这是 going on behind the scenes 的内容:
bins <- 30L
range <- range(x)
origin <- 0L
binwidth <- diff(range)/bins
breaks <- seq(origin, range[2] + binwidth, binwidth)
bins <- cut(x, breaks, include.lowest = TRUE, right = TRUE, dig.lab = 7)
table(bins)
# ...
# (0.8999984,0.9333317] (0.9333317,0.9666649] (0.9666649,0.9999982]
# 33217 33039 33297
# (0.9999982,1.033331]
# 1
max(x)
# [1] 0.9999984
How come this can happen even though coordinates are within 0 and 1 range
- binning 从
0
开始(不是最小值) - 每个 bin 的大小为
binwidth
- 有一个最终的 bin 以最大值 +
binwidth
结束,它获得最大值
Do you have any idea how to avoid this?
一种方法是定义您自己的休息时间:
ggplot(data=new.data) + stat_summary_2d(fun = mean, aes(x=x, y=y, z=z), breaks = seq(0, 1, .1))