R YaleToolkit: ¿Cómo cambiar el tamaño de fuente de las etiquetas de tick en los sparklines?
data-visualization r-grid (1)
Bueno, las sparklines
dependen en gran medida del paquete de grid
, por lo que debe profundizar para buscar esos parámetros de tamaño de fuente. Jugar con el viewpoint
probablemente te lleve allí. Para una solución fácil (pero MUY ''sin procesar''), solo use las opciones de trazado simples usando par
. De esta manera puede manipular casi todos los parámetros con mucha facilidad:
x <- data.frame(V = rnorm(1000), W = rnorm(1000), X = rnorm(1000),
Y = rnorm(1000), Z = rnorm(10))
par(mfrow=c(5,1),mar=c(1,0,0,0),oma=c(4,5,4,4))
plot(x$V,axes=F,ylab="",xlab="",main="",type="l");axis(2,cex.axis=0.7)
plot(x$W,axes=F,ylab="",xlab="",main="",type="l");axis(2,cex.axis=0.7)
plot(x$X,axes=F,ylab="",xlab="",main="",type="l");axis(2,cex.axis=0.7)
plot(x$Y,axes=F,ylab="",xlab="",main="",type="l");axis(2,cex.axis=0.7)
plot(x$Z,axes=F,ylab="",xlab="",main="",type="l");axis(2,cex.axis=0.7)
axis(1,pos=c(-2))
Estoy usando esta función para algunas chispas rápidas y fáciles con R, pero parece que no consigo resolver cómo cambiar el tamaño de fuente para evitar superposiciones feas de las etiquetas de marca del eje y. Aquí está mi código (ver más abajo para un ejemplo reproducible):
sparklines(gamma.df, sub=c(1:23),outer.margin = unit(c(2, 2, 2, 2), "cm"))
y la trama resultante:
Parece que soy capaz de suprimir completamente el eje y con
sparklines(gamma.df, sub=c(1:23),yaxis=FALSE,outer.margin = unit(c(2, 2, 2, 2), "cm"))
Pero lo que realmente quiero es simplemente reducir los números en las marcas de verificación (y agregar relleno gris debajo de la línea, pero parece que tendría que dibujar polígonos en la pantalla, lo que probablemente sea suficiente problema para merecer una pregunta separada ... y un paquete diferente).
La documentation sugiere que gpar podría ser relevante: "En todos los casos en los que se necesita una lista de parámetros gráficos, los nombres de parámetros válidos son los mismos que serían válidos cuando se pasan a gpar en la llamada correspondiente". Pero necesito un poco de ayuda para entenderlo, ya que ninguno de mis intentos parece llegar a ningún lado (ídem para cex.axis y axis ()). ¿Algún experto en gráficos de grid
de R por ahí? Los enlaces a un enfoque completamente diferente y bien documentado (ggplot2?) Que ofrece una salida de estilo de línea de brillo de mejor calidad también son bienvenidos.
Aquí hay algunos datos de ejemplo y código que reproduce mi problema:
x <- data.frame(V = rnorm(1000), W = rnorm(1000), X = rnorm(1000), Y = rnorm(1000), Z = rnorm(10))
sparklines(x,outer.margin = unit(c(2, 2, 2, 2), "cm"))
Y aquí está el diagrama de datos de ejemplo resultante con números superpuestos feos en las marcas de verificación del eje y:
ACTUALIZACIÓN : utilizando el muy útil código de plot
de @ geek-on-acid y algo de código del foro de Tufte (ver a continuación), he encontrado un método alternativo de sparkline que no usa el paquete YaleToolkit
y se ve bien ... Aquí hay un ejemplo reproducible (en realidad solo dos líneas, pero anotado aquí para mi educación):
x <- data.frame(V = rnorm(1000), W = rnorm(1000), X = rnorm(1000), Y = rnorm(1000),
Z = rnorm(1000)) # get a bit of data
par(mfrow=c(ncol(x),1), #sets number of rows in space to number of cols in data frame x
mar=c(1,0,0,0), #sets margin size for the figures
oma=c(4,5,4,4)) #sets outer margin
for (i in 1:ncol(x)){ # setup for statement to loops over all elements in a list or vector
plot(x[,i], #use col data, not rows from data frame x
col="grey",lwd=0.5, #make the line grey and thin
axes=F,ylab="",xlab="",main="",type="l"); #suppress axes lines, set as line plot
axis(2,yaxp=c(min(x[,i]),max(x[,i]),2), # y-axis: only show tickmarks for max and min values of col
cex.axis=1.1,las=1, # shrink fontsize slightly, make text horizontal for easy reading
at=c(round(min(x[,i]),3),round(max(x[,i]),3))); #specify where tickmark numbers go and round them to keep it tidy
axis(2,yaxp=c(min(x[,i]),max(x[,i]),2),col="white",tcl=0,labels=FALSE) #y-axis: put a 2nd white axis line over the 1st y-axis to make it invisible
ymin<-min(x[,i]); tmin<-which.min(x[,i]);ymax<-max(x[,i]);tmax<-which.max(x[,i]); # see the code from Jason below for what these do
points(x=c(tmin,tmax),y=c(ymin,ymax),pch=19,col=c("red","blue"),cex=1) # add coloured points at max and min
}
axis(1,pos=c(-5)) # places horizontal axis at the bottom of it all.
Aquí está la imagen resultante, que es básicamente la solución a mi problema. Las marcas de verificación del eje y intentan ser elegantes al mostrar solo los valores máximo y mínimo de los datos y no tener una línea vertical. Gracias de nuevo a @ geek-on-acid por la sugerencia sobre cómo obtener un solo eje x en la parte inferior de todos ellos.
Finalmente, para completar, incluyo un código de líneas de chispa más cercano al estilo de Tufte por Jason Dieterle que encontré en el foro de Tufte . Se ven mucho mejor que el mío, pero el código solo hace una trama a la vez. Aquí está la publicación original:
#Here is a simple R implementation of sparklines. Running sparkline() will generate a random sparkline; running sparkline(yourdata) will generate a sparkline using the data in yourdata. As an example, here is Google''s stock price for the last year.
#R sparklines
sparkline<-function(ydata=rnorm(100,500,50),width=1.5,height=0.5,sigfigs=4) {
# ydata = vector of data to be plotted
# width = width of sparlkline in inches, including text
# height = height of sparkline in inches
# sigfigs = number of significant figures to round min, max, and last values to
temppar<-par(no.readonly = TRUE) # store default graphics parameters
par(mai=c(0.10,0.05,0.10,0.05),fin=c(width,height)) # adjust graphics parameters for sparklines
len<-length(ydata) # determine the length of the data set
ymin<-min(ydata) # determine the minimum
tmin<-which.min(ydata) # and its index
ymax<-max(ydata) # determine the maximum
tmax<-which.max(ydata) # and its index
yfin<-signif(ydata[len],sigfigs) #determine most recent data point
plotrange=c(ymin-0.3*(ymax-ymin),ymax+0.3*(ymax-ymin)) # define plot range to leave enough room for min and max circles and text
plot(x=1:len,y=ydata,type="l",xlim=c(1,len*1.5),ylim=plotrange,col="gray",lwd=0.5,ann=FALSE,axes=FALSE) # plot sparkline
points(x=c(tmin,tmax),y=c(ymin,ymax),pch=19,col=c("red","blue"),cex=0.5) # plot min and max points
text(x=len,y=ymin,labels=signif(ymin,sigfigs),cex=0.5,pos=4,col="red") # show minimum value
text(x=len,y=ymax,labels=signif(ymax,sigfigs),cex=0.5,pos=4,col="blue") # show maximum value
text(x=len,y=(ymin+ymax)/2,labels=yfin,cex=0.5,pos=4) # show most recent value
par(temppar) # restore graphics defaults
}
#-- Jason Dieterle (email), January 28, 2008
y así es como se ve su salida (ampliada un poco):
Además del paquete YaleToolkit, está el paquete sparkTable que aprendí en stats.stackexchange pero no lo he probado. R-forge tiene una entrada para otro paquete para hacer sparklines, pero este parece no ser activo o útil.