O gráfico de linhas do ggplot2 fornece “geom_path: cada grupo consiste em apenas uma observação. Você precisa ajustar a estética do grupo?

170

Com este quadro de dados ("df"):

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

Eu tento criar um gráfico de linhas como este:

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

O erro que recebo é:

geom_path: cada grupo consiste em apenas uma observação. Você precisa ajustar a estética do grupo?

O gráfico aparece como um gráfico de dispersão, mesmo que eu queira um gráfico de linhas. Tentei substituir geom_line()por geom_line(aes(group = year))mas não funcionou.

Em uma resposta, disseram-me para converter o ano em uma variável fator. Eu fiz e o problema persiste. Esta é a saída de str(df)e 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")
megashigger
fonte
Não dá erro quando eu o executo. É provável que dfnão seja o que você pensa que é. Por favor, indique sua pergunta de forma reproduzível, ou seja, mostre a saída de dput(df).
G. Grothendieck
Pode ser que as suas variáveis são fatores, então você precisa convertê-los para numérico
beterraba
@ G.Grothendieck Postei o que você disse. Também converti para numérico e ainda tenho o problema.
megashigger
Você realmente deve declarar perguntas de forma reproduzível. É difícil ajudá-lo se não conseguirmos recriar o erro.
Mario Becerra

Respostas:

344

Você só precisa adicionar group = 1no ggplot ou geom_line aes ().

Para gráficos de linhas, os pontos de dados devem ser agrupados para que eles saibam quais pontos conectar. Nesse caso, é simples - todos os pontos devem estar conectados, então grupo = 1. Quando mais variáveis ​​são usadas e várias linhas são desenhadas, o agrupamento de linhas geralmente é feito por variável.

Referência: Livro de receitas para R, Capítulo: Barra de gráficos e linhas_gráficas_ (ggplot2), Gráficos de linhas.

Tente o seguinte:

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")
Mario Barbé
fonte
É importante notar que o agrupamento deve ser feito com o groupargumento. Agrupamento única por exemplo, colornão seria sufficient.I só tinha este problema e espero que isso ajude alguém correndo na mesma
Tjebo
esta resposta ainda é válida? Adicionar grupo = 1 na estética não parece mais funcionar.
Giacomo
@Giacomo - funciona para mim, no 3.6.2 em um Mac. Estava recebendo o aviso temido, mas a adição de group = 1 corrigiu o problema. ggplot (lakemeta, mapeamento = aes (x = lago, y = área, grupo = 1)) + geom_line (tamanho = 2, cor = "azul")
Jenn D.
27

Você recebe esse erro porque uma de suas variáveis ​​é realmente uma variável de fator. Executar

str(df) 

para verificar isso. Em seguida, faça essa alteração dupla para manter os números do ano em vez de se transformar em números de nível "1,2,3,4":

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

EDIT: parece que seu data.frame possui uma variável da classe "array" que pode causar o pb. Tente então:

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

e tramar de novo?

agenis
fonte
3
Esta é para mim uma resposta conveniente porque corrigir o problema pela raiz
Medhat
1
Boa resposta para evitar esse aviso!
Mihai
2

Eu tive um problema semelhante com o quadro de dados:

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

Eu acho que a variável para o eixo x deve ser numérica, para que geom_line saiba como conectar os pontos para desenhar a linha.

depois de alterar a 2ª coluna para numérico:

 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

então funciona.

Xin Niu
fonte
1

Inicie o R em uma nova sessão e cole-a em:

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")
G. Grothendieck
fonte
Inicie o R em uma nova sessão e cole o código no meu post nele.
G. Grothendieck
Você já descobriu esse problema. Eu tenho o mesmo problema que o seu, e tenho apenas um valor para cada valor de x. Esperando por sua resposta. Obrigado.
Hoang Le
0

Eu recebi um prompt semelhante. Foi porque eu havia especificado o eixo x em termos de alguma porcentagem (por exemplo: 10% A, 20% B, ....). Portanto, uma abordagem alternativa seria multiplicar esses valores e escrevê-los da forma mais simples.

Areeha
fonte