首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我试图在ggplot2中绘制一个图时会丢失值呢?

为什么当我试图在ggplot2中绘制一个图时会丢失值呢?
EN

Stack Overflow用户
提问于 2022-03-31 20:22:37
回答 1查看 94关注 0票数 0

我一直试图绘制一个图表,但出于某种原因,我一直在删除变量。我有一个包含350个观测和11个变量的数据,但是当我试图绘制我的图表时,140个观测值被删除了。

首先,我修改了dataframe,以便在连续两天内根据时间进行绘图:

代码语言:javascript
复制
library(hms)
library(dplyr)
library(ggplot2)
library(tidyr)
library(tidyverse)

    #Generate sample data
df <- data.frame(hour = hms(sample(0:59, replace = TRUE, 350),
                             sample(0:59, replace = TRUE, 350),
                             sample(c(0:5, 20:23), replace = TRUE, 350)),
                  count = floor(runif(350, min=0, max=20)))

df <- df %>%
  mutate(ai = count/10) %>% 
  mutate(graphing.date = if_else(
    hour > parse_hms("12:00:00"), as.Date("2022-02-05"), 
    as.Date("2022-02-06")), 
    graphing.datetime = as.POSIXct(paste(graphing.date, hour)))

然后我使用变量graphing.datetime和ai分别作为x和y变量:

代码语言:javascript
复制
p <- ggplot(df, aes(x = graphing.datetime, y = ai)) + 
  geom_point() + 
  scale_x_datetime("Time",
                   limits = c(as.POSIXct("2022-02-05 20:00:00"),
                              as.POSIXct("2022-02-06 06:00:00")),
                   date_breaks = "1 hours", 
                   date_labels = "%H:%M") 
p

当我这样做时,我会得到以下信息:

警告消息:删除了包含缺失值(geom_point)的140行。

我能做些什么来解决这个问题?我的代码有什么问题需要修复吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-31 21:23:22

您的示例数据(对我来说)不足以触发错误,因此我将修改它:

代码语言:javascript
复制
set.seed(42)
# ... your code ...
head(df)
#       hour count  ai graphing.date   graphing.datetime
# 1 00:58:48     5 0.5    2022-02-06 2022-02-06 00:58:48
# 2 23:48:36     7 0.7    2022-02-05 2022-02-05 23:48:36
# 3 02:29:00    18 1.8    2022-02-06 2022-02-06 02:29:00
# 4 21:58:24    13 1.3    2022-02-05 2022-02-05 21:58:24
# 5 02:20:09    14 1.4    2022-02-06 2022-02-06 02:20:09
# 6 01:43:35    14 1.4    2022-02-06 2022-02-06 01:43:35

在这里,注意观察的日期时间范围在您的p过滤器中:

代码语言:javascript
复制
range(df$graphing.datetime)
# [1] "2022-02-05 20:00:25 EST" "2022-02-06 05:59:52 EST"

这意味着,如果我们现在做你的p很多,它不会产生警告,而情节显示所有。

代码语言:javascript
复制
p <- ggplot(df, aes(x = graphing.datetime, y = ai)) + 
  geom_point() + 
  scale_x_datetime("Time",
                   limits = c(as.POSIXct("2022-02-05 20:00:00"),
                              as.POSIXct("2022-02-06 06:00:00")),
                   date_breaks = "1 hours", 
                   date_labels = "%H:%M") 
p

然而,让我们稍微收紧一下limits=,我们将得到警告:

代码语言:javascript
复制
p <- ggplot(df, aes(x = graphing.datetime, y = ai)) +

p <- ggplot(df, aes(x = graphing.datetime, y = ai)) + 
  geom_point() + 
  scale_x_datetime("Time",
                   limits = c(as.POSIXct("2022-02-05 20:10:00"),
                              as.POSIXct("2022-02-06 05:50:00")),
                   date_breaks = "1 hours", 
                   date_labels = "%H:%M") 
p
# Warning: Removed 17 rows containing missing values (geom_point).

这意味着(正如@teunbrand所指出的),您正在强制将数据从地块中删除。一些想法:

  • 展开limits=,使其包含所需的所有数据。虽然您可以根据观察到的数据以编程方式分配它,但这似乎不太有用,因为它实际上与根本不设置limits=一样。

  • “忽略”了警告,因为这并不令人惊讶:您在知情的情况下限制了可用数据的范围,所以您不应该感到惊讶。

如果您真的希望在打印/呈现此警告时保持沉默,则可以执行

  • ,而不是只在最后执行p。(其他可能有用的警告也将被抑制/隐藏,因此谨慎使用此警告。)

  • 使用coord_cartesian而不是scale_*_datetime来限制边界。这具有“裁剪”的优点--数据(在处理行/段时绝对是必需的)。然而,当不加区分地使用它时,它会产生副作用,即不告诉您是否或有多少数据超出了您的范围。(这就是为什么我们在这里使用它,是的,只要知道当使用它时,应该慎重考虑。)

P <- ggplot(df,aes(x = graphing.datetime,y= ai)) + geom_point() +scale_x_datetime(“时间”,date_breaks = "1小时“,date_labels = "%H:%M") + coord_cartesian(xlim = c(as.POSIXct("2022-02-05 20:10:00"),05:50:00"))) (“2022-02-06 as.POSIXct”)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71698739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档