2016-05-26 10 views
11

Vorrei creare una legenda orizzontale sotto il grafico ggvis. Posso usare le proprietà della legenda per posizionarlo sotto il grafico, ma non so come rendere le etichette orizzontali sotto il titolo della legenda. Di seguito è riportato il codice minimo riproducibile (prelevato dal web).Aggiungi una legenda discreta orizzontale sotto il grafico in ggvis

df1 = data.frame(x=sample(1:10), y=sample(1:10)) 
df2 = data.frame(x=1:10, y=1:10) 
df3 = data.frame(x=1:10, y=sqrt(1:10)) 

df2$id <- 1 
df3$id <- 2 
df4 <- rbind(df2,df3) 
df4$id <- factor(df4$id) 

df4 %>% ggvis(x=~x, y=~y, stroke=~id) %>% layer_lines() %>% 
    # make sure you use add relative scales 
    add_relative_scales() %>% 
    # values for x and y need to be between 0 and 1 
    # e.g for the x-axis 0 is the at far-most left point and 1 at the far-right 
    add_legend("stroke", title="Cylinders", 
       properties=legend_props(
        legend=list(
         x=scaled_value("x_rel", 0.2), 
         y=scaled_value("y_rel", -.2) 
        ))) %>% 
    layer_points(x=~x, y=~y, data=df1, stroke:='black') 
+2

Poiché questo sembra essere ancora un problema aperto [sopra alla pagina degli sviluppatori di GitGub di Ggvis] (https://github.com/rstudio/ggvis/issues/409), dubito che ciò sia possibile senza un grosso problema. Ma potrei sbagliarmi. – Felix

+0

@Felix Qualche idea se questa funzione è stata ancora aggiunta a 'ggvis'? – useR

+0

La mia risposta sembra quella che stai cercando? – useR

risposta

0

Questo è certamente un hack, ma funziona alla grande:

df4 %>% ggvis(x=~x,y=~y,stroke=~id) %>% layer_lines() %>% 
    #make sure you use add relative scales 
    add_relative_scales() %>% 
    #values for x and y need to be between 0 and 1 
    #e.g for the x-axis 0 is the at far-most left point and 1 at the far-right 
    add_legend("stroke", title = "Cylinders", values = c(1, 1), 
      properties = legend_props(
       legend = list(
       x = scaled_value("x_rel", 0.2), 
       y = scaled_value("y_rel", -.2) 
       ))) %>% 
    add_legend("stroke", title = " ", values = c(2, 2), 
      properties = legend_props(
       legend = list(
       x = scaled_value("x_rel", 0.23), 
       y = scaled_value("y_rel", -.2) 
       ))) %>% 
    layer_points(x=~x,y=~y,data = df1,stroke:='black') 

enter image description here

Fondamentalmente, io sto aggiungendo un altro add_legend, l'impostazione del titolo come vuoto, regolando la scale_value in modo che è molto vicino alla prima legenda ma non si sovrappone. Quindi ho impostato la prima legenda con values = c(1,1) e la seconda con values = c(2,2) in modo che i due valori si sovrappongano l'uno sull'altro. Questo fa sembrare una leggenda con valori orizzontali.