R语言 解释ggplot2警告:“删除了包含缺失值的k行”

vlju58qv  于 2023-03-05  发布在  其他
关注(0)|答案(7)|浏览(605)

当我尝试使用ggplot生成图时,收到此警告。
在网上研究了一段时间后,许多人认为我的数据库通常包含空值或缺失数据,但事实并非如此。
In this question接受的答案如下:
该警告意味着某些元素由于超出指定范围而被移除
我想知道这个范围到底指的是什么,怎么才能有人手动增加这个范围,以避免所有的警告?

ojsjcaue

ojsjcaue1#

您看到的行为是由于ggplot2处理绘图轴范围之外的数据的方式。scale_y_continuous(或等效的ylim)在计算统计量、汇总或回归线时排除绘图区域之外的值。coord_cartesian包括这些计算中的所有值,而不管它们在绘图区域中是否可见。以下是一些示例:

library(ggplot2)

# Set one point to a large hp value
d = mtcars
d$hp[d$hp==max(d$hp)] = 1000

所有点在此图中都可见:

ggplot(d, aes(mpg, hp)) + 
  geom_point() +
  geom_smooth(method="lm") +
  labs(title="All points are visible; no warnings")
#> `geom_smooth()` using formula 'y ~ x'

在下图中,hp = 1000的一个点超出了该图的y轴范围。由于我们使用scale_y_continuous设置y轴范围,因此该点不包含在ggplot计算的任何其他统计量或汇总度量中,如geom_smooth计算的线性回归线。ggplot还提供有关排除点的警告。

ggplot(d, aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(0,300)) +  # Change this to limits=c(0,1000) and the warning disappears
  geom_smooth(method="lm") +
  labs(title="scale_y_continuous: excluded point is not used for regression line")
#> `geom_smooth()` using formula 'y ~ x'
#> Warning: Removed 1 rows containing non-finite values (stat_smooth).
#> Warning: Removed 1 rows containing missing values (geom_point).

在下图中,hp = 1000的点仍在图的y轴范围之外。但是,由于我们使用了coord_cartesian,因此该点仍包含在ggplot计算的任何统计量或汇总度量(如线性回归线)中。
如果将此图与上一个图进行比较,您可以看到第二个图中的线性回归线具有更陡的斜率和更宽的置信带,因为计算回归线时包括了hp=1000的点,尽管该点在图中不可见。

ggplot(d, aes(mpg, hp)) + 
  geom_point() +
  coord_cartesian(ylim=c(0,300)) +
  geom_smooth(method="lm") +
  labs(title="coord_cartesian: excluded point is still used for regression line")
#> `geom_smooth()` using formula 'y ~ x'

oyxsuwqo

oyxsuwqo2#

只是为了完成eipi10给出的答案的震撼。
我也遇到了同样的问题,既没有使用scale_y_continuous,也没有使用coord_cartesian
冲突来自x轴,我在x轴上定义了limits = c(1, 30),如果你想“避开”你的条,这样的限制似乎不能提供足够的空间,所以R仍然会抛出错误
删除8行包含缺失值(geom_bar)
将x轴的限制调整为limits = c(0, 31)解决了该问题。
总之,即使您没有对y轴设置限制,也要检查x轴的行为以确保有足够的空间

67up9zun

67up9zun3#

即使您的数据福尔斯指定的限制范围内(例如c(0, 335)),添加geom_jitter()语句也可能会将某些点推到这些限制之外,从而产生相同的错误消息。

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# No jitter -- no error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    scale_y_continuous(limits=c(0,335))

# Jitter is too large -- this generates the error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    geom_jitter(position = position_jitter(w = 0.2, h = 0.2)) +
    scale_y_continuous(limits=c(0,335))
#> Warning: Removed 1 rows containing missing values (geom_point).

reprex package(v0.3.0)于2020年8月24日创建

ws51t4hk

ws51t4hk4#

我知道这个问题已经有了答案,但这是另一个可能的解决方案。由于你没有提供一个示例代码,我不能肯定。
如果你只是想摆脱它,这对我来说意味着你对输出没问题。然后你可以尝试以下操作:

  • na.rm=TRUE添加到geom_something,如下所示:geom_line(..., na.rm=TRUE )

这将明确告知geom_line(和geom_path)可以删除NA值。

分析警告消息:

警告:已删除包含缺失值的k行(geom_path)
这主要告诉您3件事:

  • geom_path正被另一个触发警告的geom_something调用。
  • 它已经删除了k行,所以如果输出符合要求,那么 * 您希望 * 删除这些行。
  • 删除的原因是一些值缺失(NA)。

警告没有告诉您的是为什么这些行有缺失(NA)值,这只有您可能知道。
一个常见的原因来自于对比例的限制,比如scale_x_datetimescale_y_continuous
这是有意义的,因为要绘制的(X,Y)对不需要为NA。
当您将X刻度设置为较大值时,没有Y,或者Y数据为NA。您将得到(X,Y)点,其中一个为NA。
您可能出于多种原因想要设置更大的比例,但ggplot总是会发现没有关联的Y值,因此触发警告而不是错误是有意义的。
祝你愉快。

xn1cxnb4

xn1cxnb45#

我也遇到过这种情况,但是我想避免额外的错误消息,同时保持提供的范围。一个选项是在设置范围之前对数据进行子集化,这样就可以按照您的意愿保留范围,而不会触发警告。

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# Setting limits with scale_y_continous (or ylim) and subsetting accordingly
## avoid warning messages about removing data
ggplot(data= subset(mtcars, hp<=300 & hp >= 100), aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(100,300))
kxxlusnw

kxxlusnw6#

另一个原因是NA的存在。假设你的数组名是arr。你可以简单地检查你的数组中是否有NA:

any(is.na(arr))

如果答案为真,则必须删除NA,如下所示:

arr = arr[-which(is.na(arr)]

即使没有any(is.na(arr)),您也可以简单地运行上面的命令,R将删除可能存在的任何NA。

wr98u20j

wr98u20j7#

2019年开发的*直方图的另一个重要变化。

计算被更新了包括了一些东西-原谅我可能过于简化了-
如根据装仓轴上的limit=()规范创建仓,
如果这比你的数据更广泛,

  • 它创建频率为0的条形
  • 它会为这些条创建相同的警告
    -与裁剪数据完全不同的问题,但消息相同。

ggplot开发人员在github中建议了几种不同的处理方法,https://github.com/tidyverse/ggplot2/issues/3265
https://github.com/tidyverse/ggplot2/issues/4083

1a.如果在轴声明中使用limit=(),请将limit=()精确地设置为条形的范围,即使轴断点更宽

或1b.将选项oob = scales::keep_oob添加到有问题的轴声明中

或2.如果使用xlimylim,则将其 Package 为coord_cartesian()

相关问题