2015-10-26 28 views
6
में किसी विशिष्ट श्रेणी के लिए साजिश पृष्ठभूमि रंग को कैसे बदलें I मेरे पास एक सरल चमकदार ऐप है और आप इसे चला सकते हैं। भूखंड ggvis द्वारा बनाए जाते हैं और उपयोगकर्ता inputSelect से छात्र का नाम चुन सकते हैं। भूखंडों में, मैं विशिष्ट स्कोर सीमा में पृष्ठभूमि का रंग बदलना चाहता हूं। उदाहरण के लिए, प्रत्येक प्लॉट में, 80 से अधिक या 50 से कम स्कोर के लिए प्लॉट पृष्ठभूमि का रंग नीले रंग के साथ हाइलाइट किया गया है (चित्र संलग्न देखें)। मैं परतों को जोड़ने और layer_rects() का उपयोग करके साजिश पर आयत खींचने की कोशिश कर रहा था, लेकिन समस्या यह है कि अलग-अलग छात्रों को चुने जाने पर एक्स-अक्ष के मान बदल दिए जाते हैं। किसी ने पहले या किसी भी विचार को किया है? और क्या यह संभव है यदि मैं चाहता हूं कि उस स्कोर सीमा में केवल अंक ही पॉप अप करें? आपका बहुत बहुत धन्यवाद!

example picआर: ggvis चमकदार ऐप

library(shiny) 
    library(ggvis) 

df <- data.frame(Student = c("a","a","a","a","a","b","b","b","b","b","c","c","c","c"), 
       year = c(seq(2001,2005,1),seq(2010,2014,1),seq(2012,2015,1)), 
       score = runif(14,min = 50,max = 100), stringsAsFactors=F) 

ui = (fluidPage(
    sidebarLayout(
    sidebarPanel(
     selectInput("stu","Choose Student", 
        choice = unique(df$Student)) 
    ), 
    mainPanel(ggvisOutput("plot")) 
    ) 
) 
) 

server = function(input,output,session){ 

    dataInput = reactive({ 
    gg = df[which(df$Student == input$stu),] 
    }) 

    vis = reactive({ 
    data = dataInput() 
    data %>% 
     ggvis(x = ~year, y = ~score) %>% 
     scale_numeric("y",domain = c(40,120))%>% 
     layer_lines() 
    }) 

    vis %>% bind_shiny("plot") 
} 

runApp(list(ui = ui, server = server)) 

उत्तर

1

आयतों की चौड़ाई x अक्ष चर के साथ बदलना होगा के लिए, आपको x = ~min(year) और x2 = ~max(year) उपयोग कर सकते हैं। मुझे यकीन नहीं है कि मौजूदा पैमाने की सीमाओं पर निर्भर चर को कैसे बनाया जाए, ऐसा लगता है कि यह एक अच्छा समाधान होगा। लेकिन, यह काम करना चाहिए। उदाहरण के लिए, कम आयत,

layer_rects(x = ~min(year), x2 =~max(year), 
      y = 40-3.5, y2 = 50, opacity := 0.05, fill := "blue") 

यह अलग सीमा (कम से कम इसे होने की मुड़कर नहीं देखा) के लिए vectorized नहीं है हो सकता है तो आप कई आयतों होने सरल करने के लिए एक समारोह लिख सकते हैं। पूरे सर्वर की तरह

shinyServer(function(input,output,session){ 

    dataInput = reactive({ 
     gg = df[which(df$Student == input$stu),] 
    }) 

    buffer <- 3.5 # set to make the rectangle reach the scale boundaries 
    rectLims <- list(lower=c(40-buffer, 80), upper=c(50, 120+buffer)) 
    make_rect <- function(vis, lims, buffer=buffer) { 
     for (i in seq_along(lims$lower)) 
      vis <- layer_rects(vis, x = ~min(year), x2 =~max(year), 
         y = rectLims$lower[i], y2 = rectLims$upper[i], 
           opacity := 0.05, fill := "blue") 
     vis 
    } 

    vis = reactive({ 
     data = dataInput() 
     data %>% 
      ggvis(x = ~year, y = ~score) %>% 
      scale_numeric("y",domain = c(40,120)) %>% 
      layer_points()%>% 
      layer_lines() %>% 
      make_rect(lims=rectLims) 
    }) 

    vis %>% bind_shiny("plot") 
}) 

लगेगा आपके दूसरे प्रश्न के लिए, यदि आप केवल उस सीमा में दिखाने के लिए अंक चाहते हैं, आप डेटा के एक उपसमूह के लिए layer_points या एक तार्किक वेक्टर (करने के लिए परिवर्तित उपयोग करने के लिए कर सकते हैं + के साथ संख्यात्मक) और का उपयोग करें कि opacity तर्क के रूप में,

vis = reactive({ 
    data = dataInput() 

    ## Option 1: and use layer_points(data=inrange) 
    ## inrange <- with(dataInput(), dataInput()[score >=80 | score <= 50,]) 

    ## Options 2, with opacity=~inrange 
    inrange = +with(data, score >=80 | score <= 50) 

    data %>% 
     ggvis(x = ~year, y = ~score) %>% 
     scale_numeric("y",domain = c(40,120)) %>% 
     layer_points(opacity = ~inrange) %>% 
     layer_lines() %>% 
     make_rect(lims=rectLims) 
}) 
+0

हाय, आप बहुत बहुत धन्यवाद! मैं यहां अपने उदाहरण डेटा पर अपना कोड चलाता हूं, मैंने पाया कि जब मैं किसी दूसरे छात्र से स्विच करता हूं तो रंग की अस्पष्टता बदल जाती है। जब यह मेरे असली डेटा पर चलाया जाता है, तो यह अधिक स्पष्ट होता है, जो बहुत तारित होता है। – wsda

+0

दूसरे प्रश्न के लिए, विकल्प 1 लौटाता है "new_prop.default में त्रुटि (एक्स, प्रॉपर्टी, स्केल, ऑफसेट, मल्टी, एनवी, इवेंट, प्रोप के लिए अज्ञात इनपुट: 200281.5897161024623" विकल्प 2 रिटर्न "त्रुटि: लंबाई (एक्स) 1 के बराबर नहीं है। "मैं" के साथ "" फ़ंक्शन "का उपयोग करने की कोशिश कर रहा था, यह अभी भी काम नहीं करता है। क्या आपके पास कोई सुझाव है? धन्यवाद! – wsda

+0

हम्म, मुझे अस्पष्टता बदलने के बारे में पता नहीं है नीले रंग के लिए, यह रहस्यमय है। दूसरे भाग के लिए, विकल्प 1 मेरे लिए ठीक काम करता प्रतीत होता है। लेकिन विकल्प 2 गलत है, इसके बारे में खेद है, मैं इसे अभी अपडेट कर दूंगा। – jenesaisquoi

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