Controlar o tamanho dos pontos em um gráfico de dispersão R?

116

Em R, a plot()função recebe um pchargumento que controla a aparência dos pontos no gráfico. Estou fazendo gráficos de dispersão com dezenas de milhares de pontos e prefiro um ponto pequeno, mas não muito pequeno. Basicamente, acho pch='.'que é muito pequeno, mas pch=19muito gordo. Existe algo no meio ou alguma forma de diminuir os pontos de alguma forma?

usuario
fonte
Em vez de tornar os pontos menores, há uma maneira de representar graficamente, digamos, que 100 pontos de dados aleatórios seriam mais fáceis de ver do que 1000?
user2363642
Para muitos pontos pequenos, usar alfa (transparência) pode tornar um gráfico de dispersão muito mais informativo do que apenas usar menos pontos para representá-lo.
1
Sugiro não usar pch='.', ficará descentralizado. Fonte: Eu costumava usar com pch='.'frequência
geneorama
@geneorama Você quer dizer usar em ·vez de .?
nanaki
@nanaki mais ou menos, mas estranhamente seu símbolo aparece como pequenas caixas quando eu o uso em R. As respostas abaixo explicam bem a abordagem certa.
geneorama

Respostas:

100

Experimente o cexargumento:

?par

  • cex
    Um valor numérico que fornece a quantidade pela qual o texto e os símbolos de plotagem devem ser ampliados em relação ao padrão. Observe que algumas funções gráficas, como plot.default, têm um argumento com esse nome que multiplica esse parâmetro gráfico, e algumas funções, como pontos, aceitam um vetor de valores que são reciclados. Outros usos terão apenas o primeiro valor se um vetor de comprimento maior que um for fornecido.
rcs
fonte
15
Acho que nunca usaria 'cex' para controlar o tamanho do símbolo, a menos que não tivesse outra opção. Só funciona algumas vezes; a regra é que quando 'cex' é definido por meio de 'par', ele afeta o tamanho (da maioria) do texto no gráfico, quando definido dentro de 'gráfico', 'cex' afeta apenas o tamanho do símbolo. Portanto, se você aplicar incorretamente essa regra, não apenas o tamanho do seu símbolo não será alterado, mas agora você terá vários parâmetros que afetam o tamanho do texto (cex.axis, cex.lab, cex.main e cex.sub - todos fazem o mesmo trabalho como 'cex', apenas em partes). Um código como esse é difícil de manter e estender.
doug,
5
Aceita. A configuração cexglobal via parmuda todos os tipos de coisas, incluindo as margens da figura, que você deve corrigir. definir cexdentro plot, no entanto, parece funcionar.
voa em
O conselho adotado acima pelo comentário de doug não está necessariamente errado, mas exagera significativamente quaisquer problemas potenciais com o uso do cexargumento durante a plotagem. Existem muitos, muitos casos em que é útil e a melhor opção.
joran,
lwdcontrola a largura da linha do pch, por exemplo plot(1:5, pch=1:5, col=1:5, lwd=1:5). Obrigado a sthda.com/english/wiki/…
geneorama
95

pch = 20 retorna um símbolo de tamanho entre "." e 19.

É um símbolo preenchido (que provavelmente é o que você deseja).

Além disso, até mesmo o sistema gráfico básico em R permite um controle refinado do usuário sobre o tamanho, cor e forma do símbolo. Por exemplo,

dfx = data.frame(ev1=1:10, ev2=sample(10:99, 10), ev3=10:1)

with(dfx, symbols(x=ev1, y=ev2, circles=ev3, inches=1/3,
                  ann=F, bg="steelblue2", fg=NULL))

Exemplo de gráfico

doug
fonte
Eu amo esse gráfico, mas gostaria que o raio fosse igual ao número de observações naquele ponto, você poderia me mostrar como fazer isso?
Derk Arts de
pi*R^2(a superfície) deve ser proporcional ao número de observações.
SESman
5
@saratis Isso fará o que você quiser:symbols(x=dfx$ev1, y=dfx$ev2, circles=sqrt(dfx$ev3/pi), inches=1/3, ann=F, bg="steelblue2", fg=NULL)
fmark
1
alguma ideia de como eu poderia usar isso para plotar várias séries no mesmo gráfico? ou seja, "points (x = dfx2 $ ev1, y = dfx2 $ ev2, circles = dfx2 $ ev3, ...)" não funciona.
Neodyme
Caso você esteja se perguntando "O que é uma polegada?" veja aqui
MichaelChirico
22

Como rcs afirmou, cexfará o trabalho no pacote gráfico básico. Acho que você não está disposto a fazer seu gráfico, ggplot2mas se o fizer, há um sizeatributo estético, que você pode controlar facilmente ( ggplot2tem argumentos de função amigáveis: em vez de digitar cex(expansão de caracteres), em ggplot2você pode digitar por exemplo size = 2e você terá um ponto de 2 mm).

Aqui está o exemplo:

### base graphics ###
plot(mpg ~ hp, data = mtcars, pch = 16, cex = .9)

### ggplot2 ###
# with qplot()
qplot(mpg, hp, data = mtcars, size = I(2))
# or with ggplot() + geom_point()
ggplot(mtcars, aes(mpg, hp), size = 2) + geom_point()
# or another solution:
ggplot(mtcars, aes(mpg, hp)) + geom_point(size = 2)
aL3xa
fonte
4
E, se você estiver realmente plotando dezenas de milhares de pontos, ggplot2 tem várias maneiras alternativas de fazer isso parecer bom - ajustes alfa, caixas hexadecimais, gráficos de contorno, etc. Verifique as páginas 72-77 do livro ggplot2, se houver algum em sua biblioteca ou se sua biblioteca tiver acesso eletrônico aos livros da Springer (acho que a maioria dos livros R está lá).
Matt Parker,
Sim ... Eu uso especialmente alphaem scatterplots, para evitar overplotting.
aL3xa
@ aL3xa Você pode usar alfa no pacote gráfico básico. Basta adicionar, por exemplo col = rgb(0, 0, 0, 0.6), opções de plotagem.
RobJan