Creo que R puede tomar mucho tiempo generar gráficos cuando hay millones de puntos presentes, lo que no es sorprendente dado que los puntos se trazan individualmente. Además, tales tramas a menudo son demasiado desordenadas y densas para ser útiles. Muchos de los puntos se superponen y forman una masa negra y se dedica mucho tiempo a trazar más puntos en esa masa.
¿Hay alguna alternativa estadística para representar datos grandes de en un diagrama de dispersión estándar? He considerado una gráfica de densidad, pero ¿qué otras alternativas hay?
r
data-visualization
Alex Stoddard
fuente
fuente
Respuestas:
Esta es una tarea difícil sin soluciones listas (esto es, por supuesto, porque la gráfica de densidad es una alternativa tan tentadora que a nadie le importa) ¿Entonces que puedes hacer?
Si realmente se superponen (es decir, tienen exactamente las mismas coordenadas X e Y) y no está usando alfa, la mejor idea sería simplemente reducir la superposición usando
unique
(con alfa, se puede sumar sobre dichos grupos).De lo contrario, puede redondear manualmente las coordenadas a los píxeles más cercanos y utilizar el método anterior (sin embargo, esta es una solución sucia).
Finalmente, puede hacer un diagrama de densidad solo para usarlo para submuestrear los puntos en las áreas más densas. Esto, por otro lado, no hará exactamente la misma trama y puede introducir artefactos si no se ajusta con precisión.
fuente
unique
o mediante el redondeo puede dar lugar a trazados sesgados (engañosos). Es importante indicar de alguna manera la cantidad de superposición a través de algunos medios gráficos como la ligereza o con las parcelas de girasol.Mire el paquete hexbin que implementa el papel / método de Dan Carr. La viñeta pdf tiene más detalles que cito a continuación:
fuente
smoothScatter {RColorBrewer}
ydensCols {grDevices}
. Puedo confirmar que funciona bastante bien con miles o millones de puntos de datos genéticos.Debo admitir que no entiendo completamente tu último párrafo:
Tampoco está claro qué tipo de trama (función) está buscando.
Dado que tiene variables métricas, puede encontrar útiles las parcelas agrupadas en hexágono o las parcelas de girasol. Para más referencias, ver
fuente
Otra respuesta directa a la pregunta es el paquete rgl, que puede trazar millones de puntos usando OpenGL. Además, especifique un tamaño de punto (por ejemplo, 3) y aleje para ver estos centros de masas como bloques monolíticos, o acerque y vea la estructura de lo que solía ser monolítico: los tamaños de los puntos son constantes pero las distancias entre ellos en la pantalla Depende del zoom. Los niveles alfa también se pueden usar.
fuente
Aquí hay un archivo que llamo
bigplotfix.R
. Si lo obtiene, definirá un contenedor para elplot.xy
cual "comprime" los datos de la trama cuando es muy grande. El reiniciador no hace nada si la entrada es pequeña, pero si la entrada es grande, la divide en trozos y solo traza el valor máximo y mínimo x e y para cada fragmento. El abastecimientobigplotfix.R
también se vuelvegraphics::plot.xy
a unir para apuntar al contenedor (el abastecimiento varias veces está bien).Tenga en cuenta que
plot.xy
es la función de "caballo de batalla" para los métodos de trazado estándar comoplot()
,lines()
, ypoints()
. Por lo tanto, puede continuar utilizando estas funciones en su código sin modificaciones, y sus grandes parcelas se comprimirán automáticamente.Este es un ejemplo de salida. Es esencialmente
plot(runif(1e5))
, con puntos y líneas, y con y sin la "compresión" implementada aquí. El gráfico de "puntos comprimidos" pierde la región central debido a la naturaleza de la compresión, pero el gráfico de "líneas comprimidas" se parece mucho más al original sin comprimir. Los tiempos son para elpng()
dispositivo; por alguna razón, los puntos son mucho más rápidos en elpng
dispositivo que en elX11
dispositivo, pero las aceleracionesX11
son comparables (X11(type="cairo")
fue más lento queX11(type="Xlib")
en mis experimentos).La razón por la que escribí esto es porque estaba cansado de correr
plot()
por accidente en un gran conjunto de datos (por ejemplo, un archivo WAV). En tales casos, tendría que elegir entre esperar varios minutos para que finalice la trama y finalizar mi sesión de R con una señal (perdiendo así mi historial de comandos y variables recientes). Ahora, si puedo recordar cargar este archivo antes de cada sesión, en realidad puedo obtener una trama útil en estos casos. Un pequeño mensaje de advertencia indica cuando los datos de la trama se han "comprimido".fuente
Tal vez me rechacen por mi método, malos recuerdos de uno de mis profesores de investigación gritando a la gente por tirar buenos datos traduciéndolos en categorías (por supuesto, estoy de acuerdo ahora un día jajaja), no lo sé. De todos modos, si estás hablando de un diagrama de dispersión, entonces he tenido los mismos problemas. Ahora, cuando tengo datos numéricos, no tiene mucho sentido clasificarlos para su análisis. Pero visualizar es una historia diferente. Lo que he encontrado que funciona mejor para mí es primero (1) dividir su variable independiente en grupos usando la función de corte. Puede jugar con el número de grupos, y luego (2) simplemente trazando el DV contra la versión cortada del IV. R generará gráficos de caja en lugar de ese gráfico de dispersión desagradable. Recomiendo eliminar los valores atípicos del diagrama (use la opción del esquema = FALSO en el comando de diagrama). Nuevamente, NUNCA desperdiciaría datos numéricos perfectamente buenos categorizando y luego analizando. Demasiados problemas para hacer eso. Aunque sé que es un tema de debate delicado. Pero hacer eso específicamente con el objetivo de al menos darle un sentido visual a los datos, no hay mucho daño que haya visto. Tracé datos tan grandes como 10M y aún así logré darle sentido a partir de este método. ¡Espero que ayude! ¡Atentamente! Lo he visto. Tracé datos tan grandes como 10M y aún así logré darle sentido a partir de este método. ¡Espero que ayude! ¡Atentamente! Lo he visto. Tracé datos tan grandes como 10M y aún así logré darle sentido a partir de este método. ¡Espero que ayude! ¡Atentamente!
fuente
Para series de tiempo grandes, he llegado a amar smoothScatter (parte de la base R no menos). A menudo tengo que incluir algunos datos adicionales, y preservar la API de trama básica es realmente útil, por ejemplo:
Lo que te da (si perdonas el diseño):
Siempre está disponible y funciona bien con enormes conjuntos de datos, por lo que es bueno al menos echar un vistazo a lo que tienes.
fuente