¿Controlar el tamaño de los puntos en una gráfica de dispersión R?

116

En R, la plot()función toma un pchargumento que controla la apariencia de los puntos en la gráfica. Estoy haciendo diagramas de dispersión con decenas de miles de puntos y prefiero un punto pequeño, pero no demasiado pequeño. Básicamente, me parece pch='.'demasiado pequeño, pero pch=19demasiado gordo. ¿Hay algo en el medio o alguna forma de reducir los puntos de alguna manera?

Mella
fuente
En lugar de hacer que los puntos sean más pequeños, ¿hay alguna manera de trazar simplemente decir que 100 puntos de datos aleatorios serían más fáciles de ver que 1000?
user2363642
Para muchos puntos pequeños, el uso de alfa (transparencia) puede hacer que un diagrama de dispersión sea mucho más informativo que simplemente usar menos puntos para trazarlo.
1
Sugiero no usarlo pch='.', estará descentrado. Fuente: solía usar a pch='.'menudo
geneorama
@geneorama ¿Te refieres a usar en ·lugar de .?
nanaki
@nanaki más o menos, pero, curiosamente, su símbolo aparece como pequeñas cajas cuando lo uso en R. Las respuestas a continuación hacen un buen trabajo al explicar el enfoque correcto.
geneorama

Respuestas:

100

Prueba el cexargumento:

?par

  • cex
    Un valor numérico que indica la cantidad en la que el texto y los símbolos de trazado deben ampliarse en relación con el valor predeterminado. Tenga en cuenta que algunas funciones gráficas como plot.default tienen un argumento con este nombre que multiplica este parámetro gráfico, y algunas funciones como puntos aceptan un vector de valores que se reciclan. Otros usos tomarán solo el primer valor si se proporciona un vector de longitud mayor que uno.
rcs
fuente
15
No creo que pueda usar 'cex' para controlar el tamaño del símbolo a menos que no tenga otra opción. Solo funciona algunas veces; la regla es que cuando 'cex' se establece a través de 'par', afecta el tamaño de (la mayoría) del texto en el gráfico, cuando se establece dentro de 'plot', 'cex' afecta solo al tamaño del símbolo. Entonces, si aplica incorrectamente esa regla, no solo el tamaño de su símbolo no cambia, sino que ahora tiene múltiples parámetros que afectan el tamaño del texto (cex.axis, cex.lab, cex.main y cex.sub: todos hacen lo mismo trabajo como 'cex', solo por partes). Un código como ese es difícil de mantener y ampliar.
doug
5
De acuerdo. La configuración cexglobal mediante parcambia todo tipo de cosas, incluidos los márgenes de las figuras, que debe corregir. sin embargo, parece que funciona el entorno cexinterior plot.
Vuela el
El consejo expuesto anteriormente por el comentario de doug no es necesariamente incorrecto, pero exagera significativamente cualquier problema potencial con el uso del cexargumento al trazar. Hay muchos, muchos casos en los que es útil y la mejor opción.
joran
lwdcontrola el ancho de línea del pch, por ejemplo plot(1:5, pch=1:5, col=1:5, lwd=1:5). Gracias a sthda.com/english/wiki/…
geneorama
95

pch = 20 devuelve un símbolo de tamaño entre "." y 19.

Es un símbolo relleno (que probablemente sea lo que quieras).

Aparte de eso, incluso el sistema de gráficos base en R permite al usuario un control detallado sobre el tamaño, el color y la forma del símbolo. P.ej,

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))

Ejemplo de gráfico

doug
fuente
Me encanta este gráfico, pero me gustaría que el radio fuera igual al número de observaciones en ese punto, ¿podría mostrarme cómo hacerlo?
Derk Arts
pi*R^2(la superficie) debe ser proporcional al número de observaciones.
SESman
5
@saratis Esto hará lo que quieras:symbols(x=dfx$ev1, y=dfx$ev2, circles=sqrt(dfx$ev3/pi), inches=1/3, ann=F, bg="steelblue2", fg=NULL)
fmark
1
¿Alguna idea de cómo podría usar esto para trazar múltiples series en el mismo gráfico? es decir, "puntos (x = dfx2 $ ev1, y = dfx2 $ ev2, círculos = dfx2 $ ev3, ...)" no funciona.
Neodyme
En caso de que se esté preguntando "¿Qué es una pulgada?" ver aquí
MichaelChirico
22

Como dijo rcs , cexhará el trabajo en el paquete de gráficos base. Creo que no está dispuesto a hacer su gráfico, ggplot2pero si lo hace, hay un sizeatributo estético que puede controlar fácilmente ( ggplot2tiene argumentos de función fáciles de usar: en lugar de escribir cex(expansión de caracteres), ggplot2puede escribir, por ejemplo, size = 2y obtendrá un punto de 2 mm).

Este es el ejemplo:

### 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
fuente
4
Y, si realmente está trazando decenas de miles de puntos, ggplot2 tiene varias formas alternativas de hacer que se vea bien: ajustes alfa, contenedores hexadecimales, diagramas de contorno, etc. Consulte las páginas 72-77 del libro ggplot2, si hay uno. en su biblioteca o si su biblioteca tiene acceso electrónico a los libros de Springer (creo que la mayoría de los libros R están ahí).
Matt Parker
Sí ... Yo lo uso especialmente alphaen diagramas de dispersión, para evitar la superposición.
aL3xa
@ aL3xa Puede usar alpha en el paquete de gráficos base. Solo agregue, por ejemplo, col = rgb(0, 0, 0, 0.6)en las opciones de trama.
RobJan