2016-05-26 9 views
11

Chciałbym umieścić poziomą legendę poniżej tabeli ggvis. Mogę użyć właściwości legendy, aby umieścić go pod wykresem, ale nie wiem, jak ustawić etykiety poziomo poniżej tytułu legendy. Poniżej znajduje się minimalny powtarzalny kod (pobrany z internetu).Dodaj poziomą dyskretną legendę pod wykresem w 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

Ponieważ to nadal wydaje się być otwartym problemem [na stronie ggvis GitHub] (https://github.com/rstudio/ggvis/issues/409), wątpię, aby było to możliwe bez poważnego ataku hakerskiego. Ale mogę się mylić. – Felix

+0

@Felix Czy jest jakiś pomysł, czy ta funkcja została dodana do 'ggvis'? – useR

+0

Czy moja odpowiedź wygląda na to, czego szukasz? – useR

Odpowiedz

0

Jest to z pewnością najbardziej hack, ale działa świetnie:

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

Zasadniczo Dodaję kolejny add_legend ustawienie tytuł jako puste, dostosowując scale_value tak że jest bardzo blisko pierwszej legendy, ale nie nakłada się. Następnie ustawiłem pierwszą legendę na values = c(1,1), a drugą na values = c(2,2), aby dwie wartości leżały jedna na drugiej. To sprawia, że ​​wygląda jak jedna legenda z wartościami poziomymi.