2011-11-29 14 views
56

मैं एक आर/ggplot नौसिखिया हूँ। मैं निरंतर परिवर्तनीय समय श्रृंखला का एक geom_line साजिश बनाना चाहता हूं और फिर घटनाओं से बना एक परत जोड़ना चाहता हूं। निरंतर परिवर्तनीय और इसकी टाइमस्टैम्प एक डेटा.फ्रेम में संग्रहीत होती है, घटनाएं और उनके टाइमस्टैम्प किसी अन्य डेटा में संग्रहीत होते हैं। फ्रेम।आर + जीजीप्लॉट: घटनाओं के साथ समय श्रृंखला

क्या मैं करूंगा वास्तव में करना पसंद finance.google.com पर चार्ट की तरह कुछ है। उन में, समय श्रृंखला स्टॉक मूल्य है और समाचार-घटनाओं को इंगित करने के लिए "झंडे" हैं। मैं वास्तव में वित्त सामग्री की साजिश नहीं कर रहा हूं, लेकिन ग्राफ का प्रकार समान है। मैं लॉग फ़ाइल डेटा के विज़ुअलाइजेशन प्लॉट करने की कोशिश कर रहा हूं। यहाँ मैं क्या मतलब का एक उदाहरण है ...

google chart with events

उचित (?), मैं एक परत (निरंतर चर टिप्पणियों के लिए एक, घटनाओं के लिए एक और) के लिए अलग data.frames का उपयोग करना चाहते हैं।

कुछ परीक्षण और त्रुटि के बाद यह जितना करीब हो सकता है उतना करीब है। यहां, मैं डेटा सेट से उदाहरण डेटा का उपयोग कर रहा हूं जो ggplot के साथ आता है। "अर्थशास्त्र" में कुछ समय-श्रृंखला डेटा शामिल है जिसे मैं साजिश करना चाहता हूं और "राष्ट्रपति" में कुछ घटनाएं (राष्ट्रपति चुनाव) शामिल हैं।

library(ggplot2) 
data(presidential) 
data(economics) 

presidential <- presidential[-(1:3),] 
yrng <- range(economics$unemploy) 
ymin <- yrng[1] 
ymax <- yrng[1] + 0.1*(yrng[2]-yrng[1]) 

p2 <- ggplot() 
p2 <- p2 + geom_line(mapping=aes(x=date, y=unemploy), data=economics , size=3, alpha=0.5) 
p2 <- p2 + scale_x_date("time") + scale_y_continuous(name="unemployed [1000's]") 
p2 <- p2 + geom_segment(mapping=aes(x=start,y=ymin, xend=start, yend=ymax, colour=name), data=presidential, size=2, alpha=0.5) 
p2 <- p2 + geom_point(mapping=aes(x=start,y=ymax, colour=name), data=presidential, size=3) 
p2 <- p2 + geom_text(mapping=aes(x=start, y=ymax, label=name, angle=20, hjust=-0.1, vjust=0.1),size=6, data=presidential) 
p2 

my attempt

सवाल:

  • यह बहुत विरल घटनाओं के लिए ठीक है, लेकिन उनमें से एक क्लस्टर है कि अगर (जैसा कि अक्सर एक लॉग फ़ाइल में होता है), यह गंदा हो जाता है। क्या ऐसी कोई तकनीक है जिसका उपयोग मैं थोड़े समय के अंतराल में होने वाली घटनाओं का एक गुच्छा प्रदर्शित करने के लिए कर सकता हूं? मैं position_jitter के बारे में सोच रहा था, लेकिन यह मेरे लिए अब तक मुश्किल था। अगर Google उनमें से बहुत सारे हैं तो Google चार्ट इन घटनाओं को "झंडे" एक दूसरे के ऊपर ढेर करते हैं।

  • मैं वास्तव में निरंतर माप प्रदर्शन के समान घटना में ईवेंट डेटा चिपकाना पसंद नहीं करता। मैं इसे एक facet_grid में रखना पसंद करूंगा। समस्या यह है कि सभी पहलुओं को एक ही डेटा से हटाया जाना चाहिए। फ्रेम (सुनिश्चित नहीं है कि यह सच है)। यदि हां, तो वह भी आदर्श नहीं लगता है (या शायद मैं सिर्फ नयी आकृति प्रदान का उपयोग कर से बचने के लिए कोशिश कर रहा हूँ?)

+6

दिलचस्प साजिश: रिपब्लिकन राष्ट्रपति सत्ता में आने के बाद नौकरी पाने की उम्मीद न करें! – James

+0

यह उदाहरण के रूप में उपयोग करने के लिए सबसे आसान और उपलब्ध डेटा था - लेकिन हाँ, यह आपको लगता है :-) – Angelo

उत्तर

36

जितना मैं @JD लांग का जवाब चाहते हैं, मैं एक है कि बस में डाल देता हूँ आर/ggplot2।

दृष्टिकोण घटनाओं का दूसरा डेटा सेट बनाना और पदों को निर्धारित करने के लिए इसका उपयोग करना है। @ एंजेलो के साथ शुरूआत:

library(ggplot2) 
data(presidential) 
data(economics) 

ईवेंट (राष्ट्रपति) डेटा खींचें, और इसे बदलें। आर्थिक डेटा के अंशों के रूप में गणना baseline और offset की गणना की जाएगी। आधार रेखा पर नीचे (ymin) सेट करें। यह वह जगह है जहां मुश्किल हिस्सा आता है। यदि वे एक साथ बहुत करीब हैं तो हमें लेबलों को छेड़छाड़ करने में सक्षम होना चाहिए।तो आसन्न लेबल के बीच अंतर निर्धारित करें (मान लें कि घटनाओं को क्रमबद्ध किया गया है)। यदि यह कुछ राशि से कम है (मैंने डेटा के इस पैमाने के लिए लगभग 4 साल उठाए हैं), तो ध्यान दें कि उस लेबल को अधिक होना चाहिए। लेकिन इसके बाद इसे एक से अधिक होना चाहिए, इसलिए TRUE की लंबाई प्राप्त करने के लिए rle का उपयोग करें (यानी, उच्च होना चाहिए) और उस का उपयोग करके ऑफसेट वेक्टर की गणना करें (TRUE की प्रत्येक स्ट्रिंग को इसकी लंबाई से नीचे गिना जाना चाहिए 2, FALSE एस सिर्फ 1 के ऑफसेट पर हैं)। बार के शीर्ष (ymax) को निर्धारित करने के लिए इसका उपयोग करें।

events <- presidential[-(1:3),] 
baseline = min(economics$unemploy) 
delta = 0.05 * diff(range(economics$unemploy)) 
events$ymin = baseline 
events$timelapse = c(diff(events$start),Inf) 
events$bump = events$timelapse < 4*370 # ~4 years 
offsets <- rle(events$bump) 
events$offset <- unlist(mapply(function(l,v) {if(v){(l:1)+1}else{rep(1,l)}}, l=offsets$lengths, v=offsets$values, USE.NAMES=FALSE)) 
events$ymax <- events$ymin + events$offset * delta 

एक साजिश में एक साथ इस लाना:

ggplot() + 
    geom_line(mapping=aes(x=date, y=unemploy), data=economics , size=3, alpha=0.5) + 
    geom_segment(data = events, mapping=aes(x=start, y=ymin, xend=start, yend=ymax)) + 
    geom_point(data = events, mapping=aes(x=start,y=ymax), size=3) + 
    geom_text(data = events, mapping=aes(x=start, y=ymax, label=name), hjust=-0.1, vjust=0.1, size=6) + 
    scale_x_date("time") + 
    scale_y_continuous(name="unemployed \[1000's\]") 

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

xrange = range(c(economics$date, events$start)) 

p1 <- ggplot(data=economics, mapping=aes(x=date, y=unemploy)) + 
    geom_line(size=3, alpha=0.5) + 
    scale_x_date("", limits=xrange) + 
    scale_y_continuous(name="unemployed [1000's]") + 
    opts(axis.text.x = theme_blank(), axis.title.x = theme_blank()) 

ylims <- c(0, (max(events$offset)+1)*delta) + baseline 
p2 <- ggplot(data = events, mapping=aes(x=start)) + 
    geom_segment(mapping=aes(y=ymin, xend=start, yend=ymax)) + 
    geom_point(mapping=aes(y=ymax), size=3) + 
    geom_text(mapping=aes(y=ymax, label=name), hjust=-0.1, vjust=0.1, size=6) + 
    scale_x_date("time", limits=xrange) + 
    scale_y_continuous("", breaks=NA, limits=ylims) 

#install.packages("ggExtra", repos="http://R-Forge.R-project.org") 
library(ggExtra) 

align.plots(p1, p2, heights=c(3,1)) 

+0

यह एक बहुत अच्छा जवाब है और एक अच्छा ggplot चित्रण है। –

+3

वाहू! आप और @ जेडीएलओंग के बीच, मैंने आज कुछ बहुत अच्छा आर कुंग फू सीखा! – Angelo

+0

बहुत उपयोगी, धन्यवाद @ ब्रायन डिग्स। एक टैड बहिष्कृत यहां कोड का एक अद्यतन संस्करण दिया गया है: http://pastebin.com/sVAACtQe (मार्जिन के साथ झुकाव करना था, थकाऊ - स्वाभाविक रूप से कॉपी-पेस्ट करने के लिए स्वतंत्र महसूस करें)। – PatrickT

81

अब मैं अगले आदमी के रूप में के रूप में ज्यादा ggplot पसंद है, लेकिन आप Google वित्त प्रकार करना चाहते हैं चार्ट, Google ग्राफिक्स एपीआई के साथ ऐसा क्यों न करें?! आप इस प्यार करने के लिए जा रहे हैं:

install.packages("googleVis") 
library(googleVis) 

dates <- seq(as.Date("2011/1/1"), as.Date("2011/12/31"), "days") 
happiness <- rnorm(365)^ 2 
happiness[333:365] <- happiness[333:365] * 3 + 20 
Title <- NA 
Annotation <- NA 
df <- data.frame(dates, happiness, Title, Annotation) 
df$Title[333] <- "Discovers Google Viz" 
df$Annotation[333] <- "Google Viz API interface by Markus Gesmann causes acute increases in happiness." 

### Everything above here is just for making up data ### 
## from here down is the actual graphics bits  ### 
AnnoTimeLine <- gvisAnnotatedTimeLine(df, datevar="dates", 
             numvar="happiness", 
             titlevar="Title", annotationvar="Annotation", 
             options=list(displayAnnotations=TRUE, 
                legendPosition='newRow', 
                width=600, height=300) 
             ) 
# Display chart 
plot(AnnoTimeLine) 
# Create Google Gadget 
cat(createGoogleGadget(AnnoTimeLine), file="annotimeline.xml") 

और यह इस शानदार चार्ट का उत्पादन:

enter image description here

+1

वाह! मुझे यह भी पता नहीं था कि आर – Angelo

+10

के लिए googleVis पैकेज था, आपको खुशी में वृद्धि हुई, है ना? देखें, ग्राफ झूठ नहीं बोलते हैं! :) –

+0

भविष्यवाणी: आप उस डेमो से एक गंभीर प्रतिनिधि टक्कर पाने जा रहे हैं। –

1

Plotly ggplots सहभागी बनाने के लिए एक आसान तरीका है। घटनाओं को प्रदर्शित करने के लिए, उन्हें उन कारकों में शामिल करें जिन्हें रंगीन जैसे सौंदर्यशास्त्र के रूप में प्रदर्शित किया जा सकता है।

अंतिम परिणाम एक साजिश है जिसे आप कर्सर को खींच सकते हैं। ब्याज के भूखंडों प्रदर्शन डेटा:

# load data  
data(presidential) 
data(economics) 

# events of interest 
events <- presidential[-(1:3),] 

# strip year from economics and events data frames 
economics$year = as.numeric(format(economics$date, format = "%Y")) 

# use dplyr to summarise data by year 
#install.packages("dplyr") 
library(dplyr) 
econonomics_mean <- economics %>% 
    group_by(year) %>% 
    summarise(mean_unemployment = mean(unemploy)) 

# add president terms to summarized data frame as a factor 
president <- c(rep(NA,14), rep("Reagan", 8), rep("Bush", 4), rep("Clinton", 8), rep("Bush", 8), rep("Obama", 7)) 
econonomics_mean$president <- president 

# create ggplot 
p <- ggplot(data = econonomics_mean, aes(x = year, y = mean_unemployment)) + 
    geom_point(aes(color = president)) + 
    geom_line(alpha = 1/3) 

यह केवल एक plotly वस्तु में ggplot बनाने के लिए कोड की एक पंक्ति लेता है:

enter image description here

यहाँ ggplot बनाने के लिए कोड है।

# make it interactive! 
#install.packages("plotly") 
library(plotly) 
ggplotly(p) 
संबंधित मुद्दे