R 添加更多数据后,geom_平滑不再工作/显示

R 添加更多数据后,geom_平滑不再工作/显示,r,ggplot2,R,Ggplot2,我每周从数据库中提取数据,并使用ggplot2绘制一些图表。本周geom_smooth不再出现了。当我删除最后一条记录时,它工作了,为什么 样本数据 有19条记录的绘图 如注释中所述,geom_smooth无法处理打开状态组中的2个元素。有趣的是,使用1或3个元素就可以了。为了解决这个问题,我决定将Open从数据中排除,它工作起来没有任何问题 data2 <- data %>% dplyr::filter(Status!="Open") ggplot(data,aes(x=date

我每周从数据库中提取数据,并使用ggplot2绘制一些图表。本周geom_smooth不再出现了。当我删除最后一条记录时,它工作了,为什么

样本数据

有19条记录的绘图

如注释中所述,geom_smooth无法处理打开状态组中的2个元素。有趣的是,使用1或3个元素就可以了。为了解决这个问题,我决定将Open从数据中排除,它工作起来没有任何问题

data2 <- data %>% dplyr::filter(Status!="Open")

ggplot(data,aes(x=date, y=per)) +
  geom_point(aes(colour=Status),size=3) +
  geom_smooth(data=data2,method = 'loess',aes(group=Status, color=Status))
如注释中所述,geom_smooth无法处理打开状态组中的2个元素。有趣的是,使用1或3个元素就可以了。为了解决这个问题,我决定将Open从数据中排除,它工作起来没有任何问题

data2 <- data %>% dplyr::filter(Status!="Open")

ggplot(data,aes(x=date, y=per)) +
  geom_point(aes(colour=Status),size=3) +
  geom_smooth(data=data2,method = 'loess',aes(group=Status, color=Status))

根据您要做/展示的内容,您可以:

1仅在有足够数据的组中使用geom_smooth,方法是在调用中指定数据参数

ggplot(data,aes(x=date, y=per)) +
  geom_point(aes(colour=Status),size=3) +
  geom_smooth(data = data %>% filter(Status != "Open"), method = 'loess', aes(color = Status))

2对所有数据一起使用geom_平滑

ggplot(data,aes(x=date, y=per)) +
  geom_point(aes(colour=Status),size=3) +
  geom_smooth(data = data, method = 'loess')

您在@hrbrmstr的注释中看到的警告来自于函数。我要退房?黄土。了解绘图背后的内容总是很有帮助的。

根据您要做/展示的内容,您可以:

1仅在有足够数据的组中使用geom_smooth,方法是在调用中指定数据参数

ggplot(data,aes(x=date, y=per)) +
  geom_point(aes(colour=Status),size=3) +
  geom_smooth(data = data %>% filter(Status != "Open"), method = 'loess', aes(color = Status))

2对所有数据一起使用geom_平滑

ggplot(data,aes(x=date, y=per)) +
  geom_point(aes(colour=Status),size=3) +
  geom_smooth(data = data, method = 'loess')

您在@hrbrmstr的注释中看到的警告来自于函数。我要退房?黄土。了解绘图背后的内容总是很有帮助的。

作为一般解决方案,可以:

library(ggplot2)
library(dplyr)

min_number <- 5    # set this to something reasonable of your choice

ggplot(data, aes(x = date, y = per, color = Status)) +
  geom_point(size=3) +
  geom_smooth(
    data = . %>% group_by(Status) %>% filter(n() >= min_number),
    method = 'loess'
  )

要仅为观察次数至少为min_的组绘制平滑图。

作为一般解决方案,可以执行以下操作:

library(ggplot2)
library(dplyr)

min_number <- 5    # set this to something reasonable of your choice

ggplot(data, aes(x = date, y = per, color = Status)) +
  geom_point(size=3) +
  geom_smooth(
    data = . %>% group_by(Status) %>% filter(n() >= min_number),
    method = 'loess'
  )

仅为观察次数最少的组绘制平滑图。

a除非您真的知道自己在做什么,否则不要在aes中使用$;b ggplot2在geom_smooth中进行了一些启发式操作,并且知道当只有一个数据点时不会尝试进行黄土计算,但是当数据点超过1个时,它不够聪明,不会进行黄土计算。当您使用整个数据集运行它时,可能会收到许多警告,并且错误非常明显。在绘图之前,必须编写验证步骤。另一个选项是面_-wrap~Status@hrbrmstr这不是原因,但是谢谢你的提示。虽然美元不是原因,但这确实是一种不好的做法,需要指出,这样其他人就不会认为这是一种好的做法。使用facet_wrap hack在ggplot2中调用单独的计算函数,并且不会导致平滑操作死机。这与开放组只有2点有关。不能在2个点之间平滑,或点少于自由度。请参阅警告和本帖。这是对第一条评论@Anonymouscoward.a的改写,除非你真的知道自己在做什么,否则不要在aes中使用$;b ggplot2在geom_smooth中进行了一些启发式操作,并且知道当只有一个数据点时不会尝试进行黄土计算,但是当数据点超过1个时,它不够聪明,不会进行黄土计算。当您使用整个数据集运行它时,可能会收到许多警告,并且错误非常明显。在绘图之前,必须编写验证步骤。另一个选项是面_-wrap~Status@hrbrmstr这不是原因,但是谢谢你的提示。虽然美元不是原因,但这确实是一种不好的做法,需要指出,这样其他人就不会认为这是一种好的做法。使用facet_wrap hack在ggplot2中调用单独的计算函数,并且不会导致平滑操作死机。这与开放组只有2点有关。不能在2个点之间平滑,或点少于自由度。请参阅警告和本帖。这是对第一条评论@Anonymouscoward的改写。使用@zack的可能有意义answer@BenG老实说,埃克塞曼的答案更好,但我对两人的帮助都投了更高的票,也许使用@zack的答案是有意义的answer@BenG老实说,阿克塞曼的回答更好,但我对他们的帮助都投了更高的票