Tôi đang sử dụng chức năng này cho một số nhanh chóng và dễ dàng sparklines
với R nhưng tôi dường như không thể tìm ra cách thay đổi kích thước phông chữ để tránh sự trùng lặp xấu của các nhãn đánh dấu trên trục y. Dưới đây là mã của tôi (xem dưới đây để biết một ví dụ tái sản xuất):R YaleToolkit: Làm thế nào để thay đổi kích thước phông chữ của nhãn tick trên sparklines?
sparklines(gamma.df, sub=c(1:23),outer.margin = unit(c(2, 2, 2, 2), "cm"))
và âm mưu kết quả:
tôi dường như để có thể hoàn toàn ngăn chặn các trục y với
sparklines(gamma.df, sub=c(1:23),yaxis=FALSE,outer.margin = unit(c(2, 2, 2, 2), "cm"))
Nhưng điều tôi thực sự muốn chỉ là thu nhỏ số bers tại dấu tick (và thêm màu xám điền dưới dòng, nhưng có vẻ như tôi đã phải vẽ đa giác trên màn hình mà có lẽ là đủ rắc rối để xứng đáng một câu hỏi riêng biệt ... và một gói khác nhau).
documentation gợi ý rằng gpar có thể có liên quan: 'Trong tất cả các trường hợp cần danh sách thông số đồ họa, tên thông số hợp lệ sẽ hợp lệ khi được chuyển đến gpar trong cuộc gọi thích hợp.' Nhưng tôi cần một chút giúp đỡ để làm cho cảm giác đó là không có nỗ lực của tôi dường như nhận được bất cứ nơi nào (ditto cho cex.axis và trục()). Bất kỳ chuyên gia nào trên đồ họa grid
của R có ở đó không? Liên kết đến một cách tiếp cận hoàn toàn khác được tài liệu hóa đầy đủ (ggplot2?) Mang đến cho đầu ra kiểu Sparkline chất lượng tốt hơn cũng được chào đón.
Dưới đây là một số dữ liệu ví dụ và mã mà tái tạo vấn đề của tôi:
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"))
Và đây là kết quả âm mưu dụ dữ liệu với số chồng chéo xấu xí tại dấu kiểm trục y:
CẬP NHẬT: Sử dụng rất hữu ích plot
mã từ @ geek-on-acid và một số mã từ T ufte diễn đàn (xem bên dưới) Tôi đã đưa ra một phương pháp sparkline thay thế không sử dụng gói YaleToolkit
và có vẻ ổn ... Đây là ví dụ có thể tái tạo (thực sự chỉ là hai dòng, nhưng được chú thích ở đây để giáo dục của tôi):
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 là hình ảnh kết quả, về cơ bản là giải pháp cho vấn đề của tôi. Dấu tick trên trục y cố gắng thanh lịch bằng cách chỉ hiển thị các giá trị tối đa và tối thiểu của dữ liệu và không có đường thẳng đứng. Cảm ơn một lần nữa để @ geek-on-acid cho tip về làm thế nào để tôi nhận được một trục x duy nhất dọc theo dưới cùng của tất cả.
Cuối cùng, cho đầy đủ tôi bao gồm một số mã cho Sparkline gần gũi hơn với Tufte's style bởi Jason Dieterle mà tôi tìm thấy trên Tufte forum. Họ trông đẹp hơn tôi nhiều, nhưng mã chỉ thực hiện một âm mưu tại một thời điểm.Dưới đây là các bài bản gốc:
#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
và đây là những gì đầu ra của ông trông giống như (mở rộng một chút):
Ngoài các gói YaleToolkit, có sparkTable package mà tôi học được ít stats.stackexchange nhưng chưa thử. R-giả mạo có một mục nhập cho another package để tạo các đường thẳng, nhưng điều này dường như không hoạt động hoặc hữu ích.
Đó là tinh chỉnh rất tốt @Ben - cũng làm xong. Có lẽ bạn nên đăng tất cả dưới dạng câu trả lời riêng thay vì chỉnh sửa. Để thêm một trục X ở phía dưới, chỉ cần thêm 'trục (1, pos = c (-4))' ngay sau vòng lặp 'for' của bạn. –
@Geek On Acid, cảm ơn một lần nữa! Tôi đã bỏ lỡ dòng cuối cùng trong câu trả lời ban đầu của bạn. Tôi đã thêm nó vào lúc này. – Ben