2011-12-01 11 views
14

मैं आर के साथ कुछ त्वरित और आसान sparklines के लिए इस फ़ंक्शन का उपयोग कर रहा हूं लेकिन मैं वाई-अक्ष टिक लेबल के बदसूरत ओवरलैप से बचने के लिए फ़ॉन्ट आकार को बदलने का तरीका प्रतीत नहीं कर सकता। यहाँ मेरी कोड (एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के लिए नीचे देखें) है:आर येलटूलकिट: स्पार्कलाइन पर टिक लेबल के फ़ॉन्ट आकार को कैसे बदलें?

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

लेकिन जो मैं वास्तव में चाहता हूं वह सिर्फ संख्या को छोटा कर रहा है टिक अंक पर बियर (और लाइन के नीचे ग्रे भरें जोड़ें, लेकिन ऐसा लगता है कि मुझे स्क्रीन पर बहुभुज आकर्षित करना होगा जो शायद एक अलग प्रश्न के लायक होने के लिए पर्याप्त परेशानी है ... और एक अलग पैकेज)।

documentation सुझाव देता है कि gpar प्रासंगिक हो सकता है: 'उन सभी मामलों में जहां ग्राफिक्स पैरामीटर की एक सूची की आवश्यकता है, वैध पैरामीटर नाम उचित कॉल में गिपर को पारित होने पर मान्य होंगे।' लेकिन मुझे इसके बारे में समझने में थोड़ी मदद की ज़रूरत है क्योंकि मेरे किसी भी प्रयास को कहीं भी नहीं मिल रहा है (cex.axis और axis() के लिए ditto। आर के 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- अक्ष tickmarks पर बदसूरत अतिव्यापी संख्या के साथ जिसके परिणामस्वरूप उदाहरण डेटा की साजिश है:

enter image description here

अद्यतन: का उपयोग सहायक plot @ गीक-ऑन-एसिड से कोड और टी से कुछ कोड यूएफटी मंच (नीचे देखें) मैं एक वैकल्पिक स्पार्कलाइन विधि के साथ आया हूं जो 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. 

परिणामस्वरूप छवि है, जो मूल रूप से मेरी समस्या का समाधान है। वाई-अक्ष टिक अंक डेटा के केवल अधिकतम और न्यूनतम मान दिखाकर और लंबवत रेखा नहीं दिखाकर सुरुचिपूर्ण होने का प्रयास करते हैं। टिप के लिए @ geek-on-acid पर फिर से धन्यवाद, मैं उन सभी के नीचे एक एक्स-अक्ष कैसे प्राप्त करूं।

enter image description here

अंत में, संपूर्णता के लिए मैं जेसन DIETERLE कि मैं Tufte forum पर पाया द्वारा Tufte's style के करीब स्पार्कलाइन के लिए कुछ कोड शामिल हैं। वे मेरी तुलना में बहुत अच्छे लगते हैं, लेकिन कोड एक समय में केवल एक साजिश करता है।यहाँ मूल पोस्ट है:

#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 package जो मैं कम से सीखा stats.stackexchange लेकिन कोशिश नहीं की है। आर-फोर्ज में स्पार्कलाइन बनाने के लिए another package के लिए एक प्रविष्टि है, लेकिन ऐसा लगता है कि यह सक्रिय या उपयोगी नहीं है।

+1

बहुत अच्छा तोड़ मरोड़ @Ben है कि - अच्छी तरह से किया हुआ। आपको शायद इसे संपादित करने के बजाय अलग जवाब के रूप में पोस्ट करना चाहिए था। नीचे एक एक्स अक्ष जोड़ने के लिए बस 'लूप' के तुरंत बाद 'अक्ष (1, pos = c (-4))' जोड़ें। –

+0

@ गीक ऑन एसिड, धन्यवाद फिर से! मैंने आपके मूल उत्तर में उस अंतिम पंक्ति को याद किया। मैंने इसे अभी जोड़ा है। – Ben

उत्तर

6

ठीक है, sparklinesgrid पैकेज पर भारी निर्भर हैं, इसलिए आपको उन फ़ॉन्ट आकार पैरामीटर की खोज करने के लिए गहरी खुदाई करने की आवश्यकता है। 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

+0

धन्यवाद, प्लॉट() का उपयोग करके स्पार्कलाइनों को दोहराने के निर्देशों के लिए आसान है। अगर मैं जो चाहता हूं उसे करने के लिए स्पार्कलाइन() नहीं मिल सकता है तो यह एक अच्छा विकल्प है, धन्यवाद। मुझे लगता है कि ggplot2 को भी अपने सेटअप को अनुकूलित करने के लिए यह बहुत आसान होना चाहिए। – Ben

+1

@ बेन आप पाएंगे कि 'ggplot2' में इसे दोहराने के साथ कुछ बाधाएं होंगी क्योंकि यह भी' ग्रिड 'पर निर्भर करती है, लेकिन यह' स्पार्कलाइन 'के मुकाबले निश्चित रूप से अधिक प्राप्त करने योग्य है। –

+0

'ggplot2' के बारे में जानना अच्छा है। आपकी पोस्ट ने मुझे मेरे प्रश्न का उत्तर देने के लिए कुछ महत्वपूर्ण अवधारणाएं दीं, जो बहुत उपयोगी है। मैंने अपने प्रश्न को अद्यतन किया है कि यह दिखाने के लिए कि मुझे 'साजिश' के साथ मूल स्पार्कलाइन बनाने के मामले में कहां मिला, शायद किसी और को विवरण उपयोगी हो सकता है। एक बार फिर धन्यवाद! – Ben

संबंधित मुद्दे