2017-01-03 4 views
11

में टिक के रूप में उपयोग करें। मैं dygraphs पैकेज का उपयोग करके साप्ताहिक डेटा ग्राफ़ कर रहा हूं। dygraphs स्वचालित रूप से साप्ताहिक डिफ़ॉल्ट धुरी का चयन करता है। हालांकि, मुझे उम्मीद है कि डिफ़ॉल्ट डेटा (रविवार) मेरे डेटा (सोमवार) के साथ लाइन करने का एक तरीका है।डिग्राफ.WEEKLY लेबलिंग सोमवार को R

# Required packages 
library("magrittr") 
library("dygraphs") 
library("xts") 

# Data 
daily <- structure(c(4000, 5000, 3000, 7000, 2000, 5000, 7000, 
        2000, 3000, 6000, 5000, 9000, 2000, 2000, 2000, 
        7000, 9000, 2000, 1000, 13000), .Dim = c(10L, 2L), .Dimnames = list(
        NULL, c("col1", "col2")), index = structure(c(1476032400, 
                    1476637200, 1477242000, 1477846800, 1478451600, 1479056400, 1479661200, 
                    1480266000, 1480870800, 1481475600), tzone = "Asia/Saigon", tclass = c("POSIXct", 
                                      "POSIXt")), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", 
                                                   "POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "Asia/Saigon", tzone = "Asia/Saigon") 

# Graph 
dygraph(daily, main = "Stackoverflow") %>% 
    dyRangeSelector() %>% 
    dyOptions(useDataTimezone = TRUE) 

dygraph render

उत्तर

1

आप एक कस्टम ticker समारोह है कि आपके डेटा के पहले दिन शुरू होता है और एक टिक स्थानों हर सात दिन का उपयोग कर प्रयास कर सकते हैं।

यहाँ एक उदाहरण dygraph-tickers.jsDygraph.getDateAxis समारोह से प्रेरित है:

dygraph(daily, main = "Stackoverflow") %>% 
    dyRangeSelector() %>% 
    dyAxis("x",ticker='function(start_time, end_time, pixels, opts, dygraph, vals) { 
     var formatter = opts("axisLabelFormatter"); 
     var ticks = []; 
     var t; 
     //spacing is a week in milliseconds 
     var spacing = 1000 * 604800; 

     for (t = start_time; t <= end_time; t += spacing) { 
      ticks.push({ v:t, 
     label: formatter(new Date(t), Dygraph.WEEKLY, opts, dygraph) 
     }); 
     } 
     return ticks; 
    }') %>% 
    dyOptions(useDataTimezone = TRUE) 
+0

यह जब 'rangePad' तर्क का उपयोग तोड़ने लगती है। इसे ठीक करने का कोई उपाय? मैं बाएं हाथ की तरफ थोड़ा पैड करना चाहता हूं और दाईं ओर एक अतिरिक्त सप्ताह का डाटापॉइंट/पैडिंग जोड़ना चाहता हूं। –

1

इस का संभावित हल (बेशक जावास्क्रिप्ट कार्यों के माध्यम dyAxis लेबल मानों को पुन: फ़ॉर्मेट होगा, यह देखते हुए कि केवल एक चीज आप की जरूरत पहले डिफ़ॉल्ट बदलते है हफ्ते का दिन)।

# libs and daily object ... 

# the x values are passed as milliseconds, turn them into a date and extract day and month 
getMonthDay <- 'function(d) { 
    var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 
    var date; 
    if (typeof d == "number") { // value 
    date = new Date(d); 
    } else { // label 
    date = new Date(d.toString().substring(0, 15)); 
    } 
    date.setDate(date.getDate() + 1); 
    return date.getUTCDate() + " " + monthNames[date.getMonth()]; 
}' 

# Graph 
dygraph(daily, main = "Stackoverflow") %>% 
    dyRangeSelector() %>% 
    dyAxis(
    "x", 
    valueFormatter = JS(getMonthDay), 
    axisLabelFormatter = JS(getMonthDay), 
    rangePad = 40 # the rangePad would adapt by itself 
) %>% 
    dyOptions(useDataTimezone = TRUE) 

ध्यान दें कि हम एक शर्त d वस्तु की type जाँच करने के लिए है:

एक नजर डालें। ; रिटर्न valueOf the date वस्तु - ऐसा इसलिए है क्योंकि

  • valueFormatter है
  • axisLabelFormatter - रिटर्न वास्तविक date ही

तो, मामले में d पैरामीटर है:

  • एक number (valueFormatter), हम बस एक नया Date वस्तु बनाने के;
  • object (अक्षस लेबलफॉर्मेटर) - हाँ, यह param को Object के रूप में भेजता है; इसलिए, हमें इसे उचित Date में परिवर्तित करने की आवश्यकता है। 00 के समय की वजह से

    Sun Oct 09 2016 00:00:00 GMT+0700 
    

    ... और, एक बार आप एक तारीख को बदलने की कोशिश, जावास्क्रिप्ट

    वापस आ जाएगी:

substring() दृष्टिकोण है क्योंकि dygraphs की जरूरत है इस तरह वस्तु भेजता है

Sat Oct 08 2016 14:00:00 GMT-0300 (Local Standard Time) 

इस तरह, हम हमेशा इसके लिए केवल दिन, महीना और वर्ष मानेंगे। इसके अलावा, आप rangePad ठीक से लागू किया जा रहा होगा:

enter image description here

+0

यह 'dyOptions (useDataTimezone = TRUE) ' –

+0

के साथ विफल रहता है, इसके बजाय स्थानीय टाइमज़ोन की बजाय यूटीसी समय में प्रदर्शित होने के बाद' dyOptions (labelsUTC = TRUE)' का उपयोग करें।यह आपके उद्देश्य के लिए बेहतर है। – bosco

+0

@dcastro यह मेरे उपयोग के मामले के लिए एक विकल्प नहीं है। मुझे स्थानीय समय या समाधान की आवश्यकता है जो ऐसा लगता है कि यह स्थानीय समय प्रदर्शित कर रहा है। –

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