Я использую эту функцию для некоторых быстрых и простых sparklines
с R, но я не могу понять, как изменить размер шрифта, чтобы избежать уродливого наложения меток на оси Y. Вот мой код (см. Ниже воспроизводимый пример):
sparklines(gamma.df, sub=c(1:23),outer.margin = unit(c(2, 2, 2, 2), "cm"))
и полученный сюжет:
Кажется, я могу полностью подавить ось 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:
ОБНОВЛЕНИЕ : Использование очень полезного 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 вдоль их нижней части.
Наконец, для полноты я включаю код для спарклайнов ближе к в стиле 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
и вот как выглядит его вывод (немного увеличенный):
В дополнение к пакету YaleToolkit есть пакет sparkTable , о котором я узнал по stats.stackexchange , но не пробовал. В R-forge есть запись для другого пакета для создания спарклайнов, но этот, похоже, не является активным или полезным.