2015-10-26 23 views
6
Aşağıda gibi basit bir parlak uygulama var ve onu çalıştırabilirsiniz. Arsalar ggvis tarafından oluşturulmuştur ve kullanıcı inputSelect'dan öğrenci adını seçebilir. Arsalarda, belirli puan aralığında arka plan rengini değiştirmek istiyorum. Örneğin, her arsada , numaralı çizimde, 80'den daha yüksek veya 50'den daha düşük puan için arsa arkaplanının rengi mavi ile işaretlenmiştir (Bkz. Resim ekli). Katmanlar eklemeye ve layer_rects() kullanarak arsa üzerinde dikdörtgenler çizmeye çalışıyordum, ancak sorun farklı öğrenciler seçilirse x ekseni değerleri değişti. Herkes bunu daha önce mi yaptı, yoksa herhangi bir fikri mi? Ve sadece o puan aralığındaki noktaların ortaya çıkmasını istemek mümkün mü? Çok teşekkürler!
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)) 

cevap

1

example pic

x-ekseni değişkenle değiştirilebilir dikdörtgenlerin genişliği için, x = ~min(year) ve x2 = ~max(year) kullanabilir. Değişkenleri mevcut ölçek sınırlarına bağlı olarak nasıl yapacağını bilmiyorum, ki bu daha hoş bir çözüm olacak gibi görünüyor. Ama bu işe yaramalı. Birden dikdörtgenler sahip basitleştirmek için bir işlev yazabilirsiniz böylece Örneğin, alt dikdörtgen, Farklı sınırlar (en azından olmasını bakmadı) için vectorized değildir

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

olurdu. Yalnızca bu aralıktaki gösterilmesini noktalarını istiyorsanız bütün sunucu veri alt kümesi layer_points veya mantıksal vektör (dönüştürülen için kullanmak yapabilir, ikinci soru için

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") 
}) 

gibi görünecektir + ile sayısal) ve opacity argüman olarak,

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

Merhaba, çok teşekkür ederim kullanan! Kodumu örnek verilerimde çalıştırıyorum, farklı bir öğrenciye geçtiğimde rengin opaklığının değiştiğini gördüm. Bu kadar kablolu olan gerçek verilerimde çalıştırıldığında daha açık. – wsda

+0

İkinci soru için, seçenek 1, "new_prop.default (x, property, scale, offset, mult, env, event,: : Bilinmeyen giriş prop: a200281.5897161024623" seçeneği. x) 1 "eşit değil." fonksiyonu "ile" yerine "kullanmaya çalışıyordu", hala işe yaramıyor. Herhangi bir öneriniz var mı? Teşekkürler! – wsda

+0

hmm, opaklık değişimini bilmiyorum mavi için, bu gizemli.İkinci bölüm için, seçenek 1 benim için iyi çalışıyor gibi görünüyor.Ama seçenek 2 yanlış, bu konuda üzgünüm, şimdi onu güncelleyeceğim – jenesaisquoi

İlgili konular