Qual é uma boa maneira de usar R para criar um gráfico de dispersão que separa os dados por tratamento?

30

Sou muito novo com R e estatísticas em geral, mas preciso fazer um gráfico de dispersão que acho que pode estar além das capacidades nativas.

Eu tenho alguns vetores de observações e quero fazer um gráfico de dispersão com eles, e cada par se enquadra em uma de três categorias. Eu gostaria de fazer um gráfico de dispersão que separa cada categoria, por cor ou por símbolo. Eu acho que isso seria melhor do que gerar três gráficos de dispersão diferentes.

Eu tenho outro problema com o fato de que em cada uma das categorias há grandes agrupamentos em um ponto, mas os agrupamentos são maiores em um grupo do que nos outros dois.

Alguém sabe uma boa maneira de fazer isso? Pacotes que devo instalar e aprender a usar? Alguém fez algo semelhante?

obrigado

crf
fonte

Respostas:

53

aglomerados grandes : se a superimposição for um problema, você poderá usar um alfa mais baixo, para que pontos únicos fiquem escuros, mas a superimposição produz cores mais intensas. Ou você alterna para histogramas 2D ou estimativas de densidade.

require ("ggplot2")
  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, colour = Species)) + stat_density2d ()
    densidade
    Você provavelmente gostaria de faceta isso ...

  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, fill = Species)) + stat_binhex (bins=5, aes (alpha = ..count..)) + facet_grid (. ~ Species)
    hexbin
    Embora você possa prosseguir com essa trama também sem facetas, a ordem das espécies especifica a imagem final.

  • Você pode evitar isso se quiser sujar as mãos um pouco (= link para explicação e código) e calcular cores misturadas para os hexágonos: insira a descrição da imagem aqui

  • Outra coisa útil é usar caixas (hex) para áreas de alta densidade e plotar pontos únicos para outras partes:

    ggplot (df, aes (x = date, y = t5)) + 
      stat_binhex (data = df [df$t5 <= 0.5,], bins = nrow (df) / 250) +
          geom_point (data = df [df$t5 > 0.5,], aes (col = type), shape = 3) +
      scale_fill_gradient (low = "#AAAAFF", high = "#000080") +
      scale_colour_manual ("response type", 
        values = c (normal = "black", timeout = "red")) + 
      ylab ("t / s")
    

    insira a descrição da imagem aqui


Por uma questão de integridade dos pacotes de plotagem, deixe-me mencionar também lattice:

require ("lattice")
  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Espécies, íris, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length, íris, grupos = íris $ Espécies, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Espécies, íris, grupos = íris $ Espécies, pch = 20) </code>

cbeleites suporta Monica
fonte
Encantador! Muito obrigado, as caixas hexagonais fizeram o truque perfeitamente!
crf
22

Esse é um dos problemas clássicos do conjunto de dados 'Iris'. Este é um link para todo um conjunto de projetos de plotagem com base nesse conjunto de dados com código R, que você pode adaptar ao seu problema.

Aqui está uma abordagem que usa com a base R, em vez de um pacote complementar.

plot(iris$Petal.Length, iris$Petal.Width, pch=21, 
     bg=c("red","green3","blue")[unclass(iris$Species)], 
     main="Edgar Anderson's Iris Data")

que produz esta figura:

insira a descrição da imagem aqui

A partir daí, dependendo do seu gráfico, você pode começar a mexer nos níveis de alfa / transparência para permitir a plotagem, etc.

Embora existam muitas razões para se manter na base R, outros pacotes simplificam a plotagem. A separação dos dados por um recurso distintivo é um dos pontos fortes dos pacotes ggplot2 e retículo . O ggplot2 cria gráficos visualmente atraentes. Ambos os pacotes são demonstrados na resposta por @cbeleites.

Fomite
fonte
4
Um pouco confuso porque, embora você recomende o ggplot2, você não o usa no seu exemplo? Uma biblioteca equivalente equivalente ao ggplot2 (ggplot2); qplot (Petal.Length, Petal.Width, color = Espécie, dados = íris, main = "Dados da íris de Edgar Anderson"). Isso também tem a vantagem de produzir automaticamente uma legenda.
Peter Ellis
@ PeterEllis Isso porque, embora eu reconheça algo que se presta bem ao ggplot2, sou apenas passivamente competente com os gráficos de base.
fomite
11
Grande truque com unclass () na base de gráficos BTW
Peter Ellis
16

Ou com ggplot2:

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) + geom_point()
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + facet_grid(~Species)

O que produz

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Roman Luštrik
fonte