2012-03-25 19 views
12

मैं एक dataframe है कि इस तरह दिखता है:गैंट शैली समय रेखा (आधार आर में) साजिश

 person n start end 
1   sam 6  0 6 
2  greg 5  6 11 
3  teacher 4 11 15 
4   sam 4 15 19 
5  greg 5 19 24 
6  sally 5 24 29 
7  greg 4 29 33 
8   sam 3 33 36 
9  sally 5 36 41 
10 researcher 6 41 47 
11  greg 6 47 53 

कहां से शुरू और अंत समय या अवधि (सैम 0 से 6 वर्ष से बात की हैं, 11 6 से ग्रेग आदि।)। एन कितनी देर तक (इस मामले में # शब्दों में) व्यक्ति ने बात की थी। मैं इसे आधार आर में एक समय रेखा के रूप में प्लॉट करना चाहता हूं (मैं अंततः ggplot2 का उपयोग कर एक समान प्रश्न पूछ सकता हूं लेकिन यह उत्तर बेस आर के लिए विशिष्ट है [जब मैं आधार कहता हूं तो मेरा मतलब है कि मानक स्थापित करने वाले पैकेज]]।

वाई अक्ष व्यक्ति द्वारा होगी और एक्स अक्ष समय होगा।

Timeline_Graph

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

मैं आपकी मदद के लिए अग्रिम धन्यवाद।

पी एस वर्ग को समाप्त रेखा खंडों के लिए तर्कsegments(... , lend=2)यह जानकारी देखकर सभी खंड तर्क से परिचित नहीं उन लोगों के लिए समय बचाने के लिए है।

उत्तर

8

जबकि y- अक्ष स्पष्ट है तुम सब करने की जरूरत है श्रेणियों के लिए संख्या आवंटित है (1: 5) और उन्हें ट्रैक। कारक के डिफ़ॉल्ट के रूप में। संख्यात्मक() का उपयोग आमतौर पर उन्हें वर्णानुक्रम में दिखाएगा लेकिन आपको वैसे भी जांच करनी चाहिए। Xaxt = 'n' तर्क के साथ अपनी साजिश बनाएं। फिर वाई-अक्ष में डालने के लिए अक्ष() कमांड का उपयोग करें।

axis(2, 1:5, myLabels) 

ध्यान रखें कि जब आप चीजों को रखने के लिए एक ही रास्ता साजिश रचने कर रहे हैं एक संख्या के साथ है। स्पष्ट x या y मान हमेशा अक्षरों पर संख्याओं के स्थान पर श्रेणी नाम लेबल वाले संख्या 1: nCategories होते हैं।

कुछ की तरह कुछ आपको पर्याप्त बंद कर देता है (मानते हैं कि आपका डेटा.फ्रेम ऑब्जेक्ट डेटाफ कहा जाता है) ...

datf$pNum <- as.numeric(datf$person) 
plot(datf$pNum, xlim = c(0, 53), type = 'n', yaxt = 'n', xlab ='Duration (words)', ylab = 'person', main = 'Speech Duration') 
axis(2, 1:5, sort(unique(datf$person)), las = 2, cex.axis = 0.75) 
with(datf, segments(start, pNum, end, pNum, lwd = 3, lend=2)) 
+0

बहुत अच्छा है। यह जो मैंने पूछा (आधार पैरामीटर के भीतर) के करीब है और मैं इसे यहां से ले जा सकता हूं। बहुत अच्छा काम। –

+0

मुझे आशा है कि आपको कोई फर्क नहीं पड़ता है, लेकिन मैंने आपके 'सेगमेंट' उपयोग में कोड ', lend = 2' का टुकड़ा फिसल दिया। –

+0

कोई जांच नहीं ...:) .- – John

28

आप कहते हैं कि आप आधार आर समाधान चाहते हैं, लेकिन आप यह क्यों नहीं कहते हैं। चूंकि यह ggplot में कोड की एक पंक्ति है, इसलिए मैं इसे वैसे भी दिखाता हूं।

library(ggplot2) 
ggplot(dat, aes(colour=person)) + 
    geom_segment(aes(x=start, xend=end, y=person, yend=person), size=3) + 
    xlab("Duration") 

enter image description here

+0

ऐसा लगता है जैसे वह अपने विकास के पैकेज के लिए अन्य सभी बाहरी निर्भरताओं से बचा है, और इसे इस तरह से रखने की कोशिश कर रहा है: http://stackoverflow.com/questions/9857787/collapse-columns-by-grouping- चर-इन-आधार। – Chase

+0

वह आधार ग्राफिक्स को बेहतर समझने के लिए, अन्य बेस ग्राफिक्स प्लॉट्स के साथ एकीकृत करने के लिए, या केवल वरीयता प्राप्त करने के लिए उपस्थिति का अधिक नियंत्रण चाहते हैं। ओह, और यह वास्तव में एक पंक्ति नहीं है। आपके पास कम से कम 2 लाइनें हैं, जिन्हें आसानी से 3 के रूप में व्याख्या किया गया है, और आप install.packages ('ggplot2') भूल गए हैं। – John

+1

@Andrie, यह बहुत अच्छा है। कारण मैं ggplot का उपयोग नहीं करना चाहता, चेस नोट्स के रूप में है, मैंने वर्डक्लाउड को छोड़कर सभी निर्भरताओं से परहेज किया है (क्योंकि यह पैकेज सी में कुछ कोडिंग करता है जो मैं करने में सक्षम नहीं हूं)। ऐसा कहा जा रहा है कि समारोह साजिश करेगा लेकिन एक संसाधित डेटा फ्रेम भी लौटाएगा जिसे ggplot को खिलाया जा सकता है (मैं इसे अपने पैकेज में एक उदाहरण के रूप में दिखाने की योजना बना रहा हूं हालांकि पैकेज निर्माण को पारित करने के लिए कोड प्राप्त करने के लिए '#' का उपयोग करना पड़ सकता है परीक्षण। जीजीप्लॉट में मुझे दिलचस्पी है क्योंकि मैं बार-बार उपायों के लिए एक ही विचार का उपयोग करूंगा और फ़ेसिंग अच्छा होगा। महान काम एंड्री +1 –

15

सुंदर @ जॉन दृष्टिकोण के समान है, लेकिन जब से मैंने किया, मैं इसे पोस्ट करेंगे :)

यहाँ एक गैंट (कोई निर्भरता) प्लॉट करने के लिए एक सामान्य समारोह है:

plotGantt <- function(data, res.col='resources', 
         start.col='start', end.col='end', res.colors=rainbow(30)) 
{ 
    #slightly enlarge Y axis margin to make space for labels 
    op <- par('mar') 
    par(mar = op + c(0,1.2,0,0)) 

    minval <- min(data[,start.col],na.rm=T) 
    maxval <- max(data[,end.col],na.rm=T) 

    res.colors <- rev(res.colors) 
    resources <- sort(unique(data[,res.col]),decreasing=T) 

    plot(c(minval,maxval), 
     c(0.5,length(resources)+0.5), 
     type='n', xlab='Duration',ylab=NA,yaxt='n') 
    axis(side=2,at=1:length(resources),labels=resources,las=1) 
    for(i in 1:length(resources)) 
    { 
    yTop <- i+0.1 
    yBottom <- i-0.1 
    subset <- data[data[,res.col] == resources[i],] 
    for(r in 1:nrow(subset)) 
    { 
     color <- res.colors[((i-1)%%length(res.colors))+1] 
     start <- subset[r,start.col] 
     end <- subset[r,end.col] 
     rect(start,yBottom,end,yTop,col=color) 
    } 
    } 
    par(mar=op) # reset the plotting margins 
} 

प्रयोग उदाहरण:

data <- read.table(text= 
'"person","n","start","end" 
"sam",6,0,6 
"greg",5,6,11 
"teacher",4,11,15 
"sam",4,15,19 
"greg",5,19,24 
"sally",5,24,29 
"greg",4,29,33 
"sam",3,33,36 
"sally",5,36,41 
"researcher",6,41,47 
"greg",6,47,53',sep=',',header=T) 

plotGantt(data, res.col='person',start.col='start',end.col='end', 
      res.colors=c('green','blue','brown','red','yellow')) 

परिणाम:

enter image description here

+0

यह उत्तर मैंने सूचीबद्ध पैरामीटर को भी पूरा किया। यह भी भयानक लग रहा है। थोड़ा अलग दृष्टिकोण साझा करने के लिए धन्यवाद। +1 –

+0

भी गैंट शब्द के लिए भी धन्यवाद। मुझे नहीं पता था कि इसे क्या कहा जाता था। –

+1

@ टाइलर रिंकर: आपका स्वागत है :)। हालांकि मैंने लेबल के लिए जगह बनाने के लिए कोड को थोड़ा बदल दिया। – digEmAll

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