ggplot2折线图给出“ geom_path:每组仅包含一个观测值。您需要调整团队审美吗?”


170

使用此数据帧(“ df”):

year pollution
1 1999 346.82000
2 2002 134.30882
3 2005 130.43038
4 2008  88.27546

我尝试创建如下折线图:

  plot5 <- ggplot(df, aes(year, pollution)) +
           geom_point() +
           geom_line() +
           labs(x = "Year", y = "Particulate matter emissions (tons)", title = "Motor vehicle emissions in Baltimore")

我得到的错误是:

geom_path:每组仅包含一个观测值。您是否需要调整小组审美?

即使我需要折线图,该图也会显示为散点图。我尝试替换为geom_line()geom_line(aes(group = year))但是没有用。

在回答中,我被告知将年份转换为因子变量。我做到了,问题仍然存在。这是输出str(df)dput(df)

'data.frame':   4 obs. of  2 variables:
 $ year     : num  1 2 3 4
 $ pollution: num [1:4(1d)] 346.8 134.3 130.4 88.3
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr  "1999" "2002" "2005" "2008"

structure(list(year = c(1, 2, 3, 4), pollution = structure(c(346.82, 
134.308821199349, 130.430379885892, 88.275457392443), .Dim = 4L, .Dimnames = list(
    c("1999", "2002", "2005", "2008")))), .Names = c("year", 
"pollution"), row.names = c(NA, -4L), class = "data.frame")

当我运行它时,它没有任何错误。可能那df不是您认为的那样。请以可重复的形式说明您的问题,即显示的输出dput(df)
G. Grothendieck 2014年

可能是您的变量是因子,那么您需要将它们转换为数值
甜菜根

@ G.Grothendieck我贴了你说的话。我也转换为数字,仍然有问题。
megashigger 2014年

您确实应该以可重复的形式陈述问题。如果我们无法重新创建错误,将很难为您提供帮助。
Mario Becerra

Answers:


344

您只需要添加group = 1到ggplot或geom_line aes()中。

对于折线图,必须将数据点分组,以便知道要连接的点。在这种情况下,这很简单-所有点都应该连接,所以group = 1。当使用更多变量并绘制多条线时,线的分组通常由变量完成。

参考:R的食谱,章节:图形Bar_and_line_graphs_(ggplot2),折线图。

试试这个:

plot5 <- ggplot(df, aes(year, pollution, group = 1)) +
         geom_point() +
         geom_line() +
         labs(x = "Year", y = "Particulate matter emissions (tons)", 
              title = "Motor vehicle emissions in Baltimore")

值得注意的是,必须对group参数进行分组。仅按分组进行分组color是不够的。我只是遇到了麻烦,希望这可以帮助遇到相同问题的人
Tjebo,

这个答案仍然有效吗?在美学中添加group = 1似乎不再起作用。
Giacomo

@Giacomo-适用于我,在Mac上的3.6.2上。正在收到可怕的警告,但是添加group = 1可以解决此问题。ggplot(lakemeta,mapping = aes(x = Lake,y = Area,group = 1))+ geom_line(size = 2,color =“ blue”)

27

之所以会出现此错误,是因为您的一个变量实际上是一个因子变量。执行

str(df) 

检查一下。然后进行此双变量更改以保留年份数字,而不是转换为“ 1,2,3,4”级别数字:

df$year <- as.numeric(as.character(df$year))

编辑:看来,您的data.frame具有类“ array”的变量,可能导致pb。然后尝试:

df <- data.frame(apply(df, 2, unclass))

并再次情节?


3
对我来说,这是一个方便的答案,因为它从根本上解决了问题
Medhat

1
避免此警告的好答案!
米海

2

我对数据框有类似的问题:

group time weight.loss
1 Control  wl1    4.500000
2    Diet  wl1    5.333333
3  DietEx  wl1    6.200000
4 Control  wl2    3.333333
5    Diet  wl2    3.916667
6  DietEx  wl2    6.100000
7 Control  wl3    2.083333
8    Diet  wl3    2.250000
9  DietEx  wl3    2.200000

我认为x轴的变量应该是数字,以便geom_line知道如何连接点以画线。

在将第二列更改为数值后:

 group time weight.loss
1 Control    1    4.500000
2    Diet    1    5.333333
3  DietEx    1    6.200000
4 Control    2    3.333333
5    Diet    2    3.916667
6  DietEx    2    6.100000
7 Control    3    2.083333
8    Diet    3    2.250000
9  DietEx    3    2.200000

然后就可以了。


1

在一个新的会话中启动R并将其粘贴到:

library(ggplot2)

df <- structure(list(year = c(1, 2, 3, 4), pollution = structure(c(346.82, 
134.308821199349, 130.430379885892, 88.275457392443), .Dim = 4L, .Dimnames = list(
    c("1999", "2002", "2005", "2008")))), .Names = c("year", 
"pollution"), row.names = c(NA, -4L), class = "data.frame")

df[] <- lapply(df, as.numeric) # make all columns numeric

ggplot(df, aes(year, pollution)) +
           geom_point() +
           geom_line() +
           labs(x = "Year", 
                y = "Particulate matter emissions (tons)", 
                title = "Motor vehicle emissions in Baltimore")

在一个新的会话中启动R并将代码粘贴到我的帖子中。
G. Grothendieck

您知道这个问题了吗?我对您有同样的问题,每个x值只有一个值。等待您的答复。谢谢。
昂勒

0

我也收到类似的提示。这是因为我以某个百分比指定了x轴(例如:10%A,20%B等)。因此,另一种方法是将这些值相乘并以最简单的形式编写它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.