R YaleToolkit: Как изменить размер шрифта тиковых меток на спарклайнах? - PullRequest
16 голосов
/ 01 декабря 2011

Я использую эту функцию для некоторых быстрых и простых sparklines с R, но я не могу понять, как изменить размер шрифта, чтобы избежать уродливого наложения меток на оси Y. Вот мой код (см. Ниже воспроизводимый пример):

sparklines(gamma.df, sub=c(1:23),outer.margin = unit(c(2, 2, 2, 2), "cm"))

и полученный сюжет:

enter image description here

Кажется, я могу полностью подавить ось Y с помощью

sparklines(gamma.df, sub=c(1:23),yaxis=FALSE,outer.margin = unit(c(2, 2, 2, 2), "cm"))

Но то, что я действительно хочу, это просто уменьшить цифры на отметках (и добавить серую заливку под линией, но похоже, что мне придется рисовать многоугольники на экране, что, вероятно, достаточно проблем, чтобы заслужить отдельный вопрос) ... и другой пакет).

Документация предполагает, что gpar может иметь значение: «Во всех случаях, когда необходим список графических параметров, действительные имена параметров совпадают с действительными, если передан gpar в соответствующем вызове. Но мне нужна небольшая помощь, чтобы понять это, поскольку ни одна из моих попыток, похоже, никуда не делась (то же самое для cex.axis и axis ()). Есть специалисты по R grid графике? Также приветствуются ссылки на хорошо документированный совершенно другой подход (ggplot2?), Который обеспечивает лучшее качество вывода в стиле спарклайна.

Вот некоторые примеры данных и кода, которые повторяют мою проблему:

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:

enter image description here

ОБНОВЛЕНИЕ : Использование очень полезного plot кода от @ geek-on-acid и некоторого кода с форума Tufte (см. Ниже). Я придумал Альтернативный метод спарклайна, который не использует пакет YaleToolkit и выглядит хорошо ... Вот воспроизводимый пример (на самом деле это всего две строки, но здесь аннотировано для моего образования):

     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. 

Вот полученное изображение, которое в основном и является решением моей проблемы. Отметки по оси Y стараются быть элегантными, показывая только максимальные и минимальные значения данных и не имея вертикальной линии. Еще раз спасибо @ geek-on-acid за подсказку о том, как получить единственную ось X вдоль их нижней части.

enter image description here

Наконец, для полноты я включаю код для спарклайнов ближе к в стиле Tufte от Jason Dieterle, который я нашел на форуме Tufte . Они выглядят намного лучше, чем мой, но код делает только один сюжет за раз. Вот оригинальный пост:

#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

и вот как выглядит его вывод (немного увеличенный):

enter image description here

В дополнение к пакету YaleToolkit есть пакет sparkTable , о котором я узнал по stats.stackexchange , но не пробовал. В R-forge есть запись для другого пакета для создания спарклайнов, но этот, похоже, не является активным или полезным.

1 Ответ

7 голосов
/ 01 декабря 2011

Ну, sparklines сильно зависят от пакета grid, так что вам нужно углубиться в поиск этих параметров размера шрифта.Игра с viewpoint, вероятно, приведет вас туда.Для простого (но ОЧЕНЬ «сырого») решения просто используйте простые параметры черчения, используя par - таким образом вы можете очень легко управлять почти каждым параметром:

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

enter image description here

...