2009-12-26 12 views
7

Me he encontrado con una serie de situaciones en las que quiero trazar más puntos de los que realmente debería tener: la principal dificultad es que cuando comparto mis tramas con personas o las incrusto en documentos, ocupan demasiado espacio. Es muy sencillo muestrear aleatoriamente las filas en un marco de datos.puntos máximos de trazado en R?

si quiero una muestra verdaderamente aleatoria de una parcela punto, es fácil decir:

ggplot(x,y,data=myDf[sample(1:nrow(myDf),1000),]) 

Sin embargo, me preguntaba si había más efectiva (idealmente en lata) formas de especificar el número de puntos de la trama de modo que sus datos reales se reflejen con precisión en la trama. Entonces aquí hay un ejemplo. Supongamos que estoy tramando algo así como el CCDF de una distribución de cola pesada, p.

ccdf <- function(myList,density=FALSE) 
{ 
    # generates the CCDF of a list or vector 
    freqs = table(myList) 
    X = rev(as.numeric(names(freqs))) 
    Y =cumsum(rev(as.list(freqs))); 
    data.frame(x=X,count=Y) 
} 
qplot(x,count,data=ccdf(rlnorm(10000,3,2.4)),log='xy') 

Esto producirá una parcela donde las x & eje y se vuelven cada vez más densa. Aquí sería ideal tener menos muestras trazadas para valores x o y grandes.

¿Alguien tiene alguna sugerencia o sugerencia para resolver problemas similares?

Gracias, -e

+0

Hola Rob, Dirk - Quiero aclarar que yo soy no buscando una forma de lidiar con el sobrerrollado usando un método de visualización diferente. Específicamente, quiero hacer un diagrama de puntos que pueda incrustar en un papel LaTeX como un gráfico vectorial escalable. La forma en que me gustaría hacer esto es reducir el número de puntos de trama necesarios para transmitir mis datos. – eytan

+0

Entonces el submuestreo puede ser su mejor opción. Eso, por supuesto, puede hacerse con un muestreo "no uniforme", por lo que es posible que desee mantener más puntos (o incluso todos) de las colas, pero puede darse el lujo de reducir la parte principal de manera espectacular. Pero esto parece específico del problema, por lo que es posible que deba cocinarlo usted mismo. –

Respuesta

4

Aquí hay una posible solución para la gráfica de disminución de la resolución con respecto al eje x, si se transforma de forma logarítmica. Se log transforma el eje x, redondea que la cantidad, y recoge el valor x mediana en que bin:

downsampled_qplot <- function(x,y,data,rounding=0, ...) { 
    # assumes we are doing log=xy or log=x 
    group = factor(round(log(data$x),rounding)) 
    d <- do.call(rbind, by(data, group, 
    function(X) X[order(X$x)[floor(length(X)/2)],])) 
    qplot(x,count,data=d, ...) 
} 

Usando la definición de ccdf() desde arriba, entonces podemos comparar la trama original de la CCDF de la distribución con la versión downsampled:

myccdf=ccdf(rlnorm(10000,3,2.4)) 

qplot(x,count,data=myccdf,log='xy',main='original') 

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=1,main='rounding = 1') 

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=0,main='rounding = 0') 

en formato PDF, la trama original ocupa 640 KB, y las versiones submuestreadas ocupan 20K y 8K, respectivamente.

+0

en lugar de redondear, también se podría hacer más generalmente como: group = cut (log (data $ x), b = maxpoints) – eytan

8

que tienden a utilizar los archivos PNG en lugar de gráficos de vectores basados ​​tales como PDF o EPS por esta situación. Los archivos son mucho más pequeños, aunque pierdes resolución.

Si se trata de un diagrama de dispersión más convencional, usar colores semitransparentes también ayuda, así como resolver el problema de sobreimpresión. Por ejemplo,

x <- rnorm(10000); y <- rnorm(10000) 
qplot(x, y, colour=I(alpha("blue",1/25))) 
5

sugerencias de Rob Más allá, una función plot me gusta como lo hace el 'adelgazamiento' para usted es hexbin; un ejemplo es at the R Graph Gallery.

+3

O, con ggplot2, 'geom =" hex "' – hadley

2

Me o bien hacer archivos de imagen (dispositivos PNG o JPEG) como Rob ya se ha mencionado, o que sería un 2D histogram. Una alternativa al histograma 2D es un smoothed scatterplot, se hace un gráfico similar pero tiene un corte más suave de regiones densas a esparcidas del espacio.

Si nunca antes ha visto addictedtor, merece la pena echarle un vistazo. Tiene algunos gráficos muy agradables generados en R con imágenes y código de muestra.

Aquí está el código de ejemplo de la addictedtor sitio:

2-d histograma:

require(gplots) 

# example data, bivariate normal, no correlation 
x <- rnorm(2000, sd=4) 
y <- rnorm(2000, sd=1) 

# separate scales for each axis, this looks circular 
hist2d(x,y, nbins=50, col = c("white",heat.colors(16))) 
rug(x,side=1) 
rug(y,side=2) 
box() 

smoothscatter:

library("geneplotter") ## from BioConductor 
require("RColorBrewer") ## from CRAN 

x1 <- matrix(rnorm(1e4), ncol=2) 
x2 <- matrix(rnorm(1e4, mean=3, sd=1.5), ncol=2) 
x <- rbind(x1,x2) 

layout(matrix(1:4, ncol=2, byrow=TRUE)) 
op <- par(mar=rep(2,4)) 
smoothScatter(x, nrpoints=0) 
smoothScatter(x) 
smoothScatter(x, nrpoints=Inf, 
       colramp=colorRampPalette(brewer.pal(9,"YlOrRd")), 
       bandwidth=40) 
colors <- densCols(x) 
plot(x, col=colors, pch=20) 

par(op) 
Cuestiones relacionadas