2011-12-01 26 views
14

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ả:

enter image description here

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:

enter image description here

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ả.

enter image description here

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

enter image description here

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.

+1

Đó 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. –

+0

@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

Trả lời

6

Vâng, sparklines phụ thuộc nhiều vào gói grid, vì vậy bạn cần đào sâu để tìm kiếm các thông số kích thước phông chữ đó. Chơi với viewpoint có thể sẽ đưa bạn đến đó. Đối với một giải pháp dễ dàng (nhưng RẤT 'thô'), chỉ cần sử dụng tùy chọn âm mưu đơn giản sử dụng par - cách này bạn có thể thao tác hầu hết các thông số rất dễ dàng:

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

+0

Cảm ơn bạn, đó là tiện dụng để có các hướng dẫn sao chép tia lửa bằng cách sử dụng plot(). Nếu tôi không thể có được sparklines() để làm những gì tôi muốn thì đây là một lựa chọn tuyệt vời, cảm ơn một lần nữa. Tôi đoán nó nên được khá đơn giản để thích ứng với thiết lập của bạn để ggplot2 cũng. – Ben

+1

@Ben Bạn có thể thấy rằng sẽ có một số chướng ngại vật với việc sao chép nó trong 'ggplot2' bởi vì nó cũng phụ thuộc rất nhiều vào' lưới', nhưng nó chắc chắn có thể đạt được nhiều hơn với 'sparklines'. –

+0

Điều cần biết về 'ggplot2'. Bài đăng của bạn đã cho tôi một vài khái niệm chính để trả lời câu hỏi của tôi, điều này rất hữu ích. Tôi đã cập nhật câu hỏi của mình để chỉ ra nơi nó đã cho tôi về việc tạo ra các tia sáng cơ bản với 'cốt truyện', có lẽ ai đó khác có thể tìm thấy các chi tiết hữu ích. Cảm ơn một lần nữa! – Ben

Các vấn đề liên quan