2015-10-01 2 views
8

ggplot2 में स्टॉक डेटा की साजिश करते समय और एक्स-अक्ष के साथ सप्ताहांत और छुट्टियों से अंतराल वाले मुद्दों में चल रहे मुद्दों में चल रहा है। this पोस्ट बहुत उपयोगी रहा है, लेकिन आदेशित कारकों का उपयोग करने की कोशिश करते समय मैं विभिन्न मुद्दों में भाग लेता हूं।ggplot2: x-axis तिथियों से सप्ताहांत और छुट्टियों के लिए रिक्त स्थान हटाएं

library(xts) 
library(grid) 
library(dplyr) 
library(scales) 
library(bdscale) 
library(ggplot2) 
library(quantmod) 

getSymbols("SPY", from = Sys.Date() - 1460, to = Sys.Date(), adjust = TRUE, auto.assign = TRUE) 

input <- data.frame(SPY["2015/"]) 
names(input) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted") 

# i've tried changing rownames() to index(), and the plot looks good, but the x-axis is inaccurate 
# i've also tried as.factor() 
xaxis <- as.Date(rownames(input)) 
input$xaxis <- xaxis 

p <- ggplot(input) 
p <- p + geom_segment(aes(x = xaxis, xend = xaxis, y = Low, yend = High), size = 0.50)   # body 
p <- p + geom_segment(aes(x = xaxis - 0.4, xend = xaxis, y = Open, yend = Open), size = 0.90) # open 
p <- p + geom_segment(aes(x = xaxis, xend = xaxis + 0.4, y = Close, yend = Close), size = 0.90) # close 
p <- p + scale_y_continuous(scale_y_log10()) 
p + ggtitle("SPY: 2015") 

enter image description here

(बिना लाल बक्से) ऊपर साजिश ऊपर कोड खंड के साथ उत्पन्न होता है। और कुछ समाधानों का प्रयास करते समय निम्नलिखित चार्ट कुछ समस्याएं हैं। सबसे पहले, अगर मैं डेटा फ्रेम की अनुक्रमणिका का उपयोग करने का प्रयास करता हूं, तो मैं अच्छा दिखने वाला ग्राफ उत्पन्न करूंगा, लेकिन एक्स-अक्ष गलत है; डेटा वर्तमान में अक्टूबर में समाप्त हो जाती है, लेकिन यह नीचे की साजिश में जुलाई में समाप्त होता है: enter image description here

xaxis <- as.Date(index(input)) 

दूसरा, अगर मैं एक आदेश दिया कारक को rownames मजबूर कोशिश, मैं अपने क्षैतिज टिक डेटा (खुला और का प्रतिनिधित्व खोना बन्द)। अगर मैं पैकेज bdscale का उपयोग
enter image description here

xaxis <- factor(rownames(input), ordered = TRUE) 

क्षैतिज टिक दूर करने का एक ही मुद्दा होता है, लेकिन ग्रिडलाइनें क्लीनर हैं:

enter image description here

p <- p + scale_x_bd(business.dates = xaxis) 
+0

ऊपर अपने प्रश्न में, क्या X- अक्ष में "(बिना लाल बक्से) ऊपर साजिश" उत्पादन के बारे में गलत है? – shekeine

+0

लाल बक्से एक्स-अक्ष में अंतराल को हाइलाइट करते हैं जिन्हें मैं निकालना चाहता हूं। मुझे एक साजिश चाहिए जो दूसरी साजिश (कोई अंतर नहीं) की तरह दिखती है, लेकिन पहली साजिश के एक्स-अक्ष के साथ – jonnie

+0

तो फिर, समस्याएं छुट्टियों या सप्ताहांत की तारीखों की स्वचालित पहचान की समस्या है, क्योंकि यदि आपने ऐसा किया है तो आप सबसेट कर सकते हैं केवल इनपुट दिनों को बनाए रखने के लिए 'इनपुट', है ना? – shekeine

उत्तर

2

आप शायद करने की आवश्यकता होगी तारीखों को लगातार निरंतर मूल्यों के रूप में मानें। अक्ष लेबल की

getSymbols("SPY", from = Sys.Date() - 1460, to = Sys.Date(), adjust = TRUE, auto.assign = TRUE) 
SPY <- SPY["2015/"] 
colnames(SPY) <- sub("SPY.","", colnames(SPY)) 
month_brks <- c(1,endpoints(SPY, "months")[-1]) 

p <- ggplot(data.frame(xaxis=seq(nrow(SPY)), SPY)) 
p <- p + geom_linerange(aes(x=xaxis, ymin=Low, ymax=High), size=.5) 
p <- p + geom_text(aes(x = xaxis, y = Open), size = 4., label="-", hjust=.7, vjust=0) # Open 
p <- p + geom_text(aes(x = xaxis, y = Close), size = 4., label="-", hjust=-.1, vjust=0) # close 
p <- p + scale_x_continuous(breaks=month_brks, labels=format(index(SPY)[month_brks], "%d %b %Y")) 
p <- p + labs(title="SPY: 2015", x="Date", y="Price") 

अद्यतन

उपचार अपडेट किया गया: अपने कोड का थोड़ा सरलीकृत संस्करण के साथ यह दृष्टिकोण की तरह लग रहे हो सकता है।

+0

यह बहुत अच्छा है, धन्यवाद! मुझे धुरी लेबल – jonnie

1

अच्छा, आप इसे मैन्युअल रूप से ट्वीक कर सकते हैं, लेकिन यह हैकी की तरह है। सबसे पहले, आप, सूचकांक का उपयोग करना चाहिए ताकि अपनी टिप्पणियों 188.

input$xaxis <-index(as.Date(rownames(input))) 

तब से 1 गिने जा रहे हैं अपनी खुद की साजिश कोड:

p <- ggplot(input) 
p <- p + geom_segment(aes(x = xaxis, xend = xaxis, y = Low, yend = High), size = 0.50)   # body 
p <- p + geom_segment(aes(x = xaxis - 0.4, xend = xaxis, y = Open, yend = Open), size = 0.90) # open 
p <- p + geom_segment(aes(x = xaxis, xend = xaxis + 0.4, y = Close, yend = Close), size = 0.90) # close 
p <- p + scale_y_continuous(scale_y_log10()) + ggtitle("SPY: 2015") 

और अंत में, मैं इनपुट में देखा जहां टूट जाता है बनाया जाना चाहिए , और आपूर्ति की मैन्युअल रूप से लेबल:

p + scale_x_continuous(breaks=input$xaxis[c(1,62,125,188)], labels=c("jan","apr","jul","oct")) 

नोट यहाँ है कि मैं आलसी था और बस, 1 जनवरी, 1 अप्रैल 1-Jul और 1 अक्टूबर के लिए निकटतम तारीख लिया क्योंकि 1 जनवरी को एक छुट्टी है, लेबल "जन" 2-जनवरी से नीचे है। और मैंने 30-सीईपी से नीचे "ऑक्ट" लेबल रखा, पिछली प्रविष्टि input में। आप जिस तरह से चाहें इसे समायोजित कर सकते हैं।

बेशक, आप लेबल को तारीख के साथ एक लेबल फ़ील्ड जोड़ सकते हैं और महीने निकाल सकते हैं।

+0

के साथ खेलना होगा, आपका आउटपुट सबसे अच्छा दिखता है! बहुत बहुत धन्यवाद – jonnie

1

आप इस के लिए bdscale उपयोग करने के लिए, बस अधिक ग्रिडलाइनें उपयोग करने के लिए यह बताना चाहते हैं तो:

ggplot(input) + 
    geom_segment(aes(x = xaxis, xend = xaxis, y = Low, yend = High), size = 0.50) +   # body 
    geom_segment(aes(x = xaxis - 0.4, xend = xaxis, y = Open, yend = Open), size = 0.90) + # open 
    geom_segment(aes(x = xaxis, xend = xaxis + 0.4, y = Close, yend = Close), size = 0.90) + # close 
    ggtitle("SPY: 2015") + 
    xlab('') + ylab('') + 
    scale_x_bd(business.dates=xaxis, max.major.breaks=10, labels=date_format("%b '%y")) # <==== !!!! 

enter image description here

यह वहाँ अक्ष अक्टूबर रखना चाहिए, लेकिन यह है कि स्मार्ट नहीं है। Womp गर्भ। पुल अनुरोध स्वागत है!

+0

धन्यवाद डेव! अंतिम एक्स-अक्ष टिक के अलावा, ऐसा प्रतीत होता है कि आपके कार्यान्वयन ने खुले और करीबी क्षैतिज टिक को हटा दिया है जिसे मैं संरक्षित करने की कोशिश कर रहा हूं। – jonnie

+0

या मैं देखता हूं कि आपका क्या मतलब है। जिस तरह से 'बीडीएसकेले' काम करता है, यह आपकी तिथियों को इंडेक्स में आपकी दिनांक सरणी में अनुवाद करता है; यह एक नकली निरंतर पैमाने है, कोई अंश नहीं हैं।'geom_vline' आपको धुरी स्केलिंग को बाधित करने की अनुमति देता है, मुझे देखने दें कि 'geom_segment' के लिए ऐसा करने का कोई तरीका है या नहीं। – dvmlls

1

नीचे दी गई विधि अनुपलब्ध साजिशों के बीच रिक्त स्थान को हटाने के लिए फ़ेसटिंग का उपयोग करती है, फिर एक अज्ञात साजिश के रूप में पुनर्प्राप्त करने के लिए पहलुओं के बीच सफेद स्थान हटा देती है।

सबसे पहले, हम एक समूहीकरण चर बनाते हैं जो प्रत्येक बार वृद्धि में दिनांक होता है (this SO answer से अनुकूलित कोड)। हम इसे बाद में उपयोग करने के लिए उपयोग करेंगे।

input$group = c(0, cumsum(diff(input$xaxis) > 1)) 

अब हम आपके प्लॉट में निम्नलिखित कोड जोड़ते हैं। facet_grid प्रत्येक स्थान पर एक नया पहलू बनाता है जहां सप्ताहांत या छुट्टी के कारण तिथि अनुक्रम में ब्रेक होता था। scale_x_date प्रति सप्ताह एक बार प्रमुख टिक अंक और प्रत्येक दिन के लिए मामूली ग्रिड लाइन जोड़ता है, लेकिन आप इसे समायोजित कर सकते हैं। theme समारोह पहलुओं के बीच पहलू पट्टी लेबल और ऊर्ध्वाधर रिक्त स्थान से छुटकारा मिलता है:

p + facet_grid(. ~ group, space="free_x", scales="free_x") + 
    scale_x_date(breaks=seq(as.Date("2015-01-01"),max(input$xaxis), "1 week"), 
       minor_breaks="1 day", 
       labels=date_format("%b %d, %Y")) + 
    theme(axis.text.x=element_text(angle=-90, hjust=0.5, vjust=0.5, size=11), 
     panel.margin = unit(-0.05, "lines"), 
     strip.text=element_text(size=0), 
     strip.background=element_rect(fill=NA)) + 
    ggtitle("SPY: 2015") 

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

enter image description here

1

पाने के लिए OHLC करने के लिए काम नहीं कर पाए हैं।

मुझे पता है कि यह बिल्कुल ठीक नहीं है जिसे आपने पूछा था, लेकिन क्या मैं आपको इसके बजाय एक स्वादिष्ट मोमबत्ती चार्ट के साथ लुभा सकता हूं?

library(dplyr) 
library(bdscale) 
library(ggplot2) 
library(quantmod) 
library(magrittr) 
library(scales) 

getSymbols("SPY", from = Sys.Date() - 1460, to = Sys.Date(), adjust = TRUE, auto.assign = TRUE) 

input <- data.frame(SPY["2015/"]) %>% 
    set_names(c("open", "high", "low", "close", "volume", "adjusted")) %>% 
    mutate(date=as.Date(rownames(.))) 

input %>% ggplot(aes(x=date, ymin=low, ymax=high, lower=pmin(open,close), upper=pmax(open,close), 
        fill=open<close, group=date, middle=pmin(open,close))) + 
    geom_boxplot(stat='identity') + 
    ggtitle("SPY: 2015") + 
    xlab('') + ylab('') + theme(legend.position='none') + 
    scale_x_bd(business.dates=input$date, max.major.breaks=10, labels=date_format("%b '%y")) 

enter image description here

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