2016-05-26 16 views
11

Ich möchte eine horizontale Legende unterhalb der ggvis Grafik machen. Ich kann Legendeneigenschaften verwenden, um sie unter dem Diagramm zu platzieren, aber ich weiß nicht, wie die Beschriftungen unterhalb des Legendentitels horizontal ausgerichtet werden. Unten ist der minimale reproduzierbare Code (aus dem Internet).Fügen Sie eine horizontale diskrete Legende unter dem Diagramm 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

Da dies immer noch ein offenes Thema zu sein scheint (über die ggvis GitHub-Entwickler-Seite) (https://github.com/rstudio/ggvis/issues/409), bezweifle ich, dass dies ohne einen größeren Hack möglich ist. Aber ich könnte falsch liegen. – Felix

+0

@Felix Gibt es eine Idee, ob diese Funktion zu 'ggvis' hinzugefügt wurde? – useR

+0

Scheint meine Antwort so, wie Sie suchen? – useR

Antwort

0

Dies ist sicherlich ein Hack, aber funktioniert gut:

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

Grundsätzlich bin ich ein weiteres add_legend Hinzufügen der Titel als leere Einstellung, die scale_value so eingestellt wird, dass Es ist sehr nah an der ersten Legende, aber nicht überlappend. Ich setze dann die erste Legende mit values = c(1,1) und die zweite mit values = c(2,2), so dass die beiden Werte übereinander gestapelt werden. Dadurch sieht es wie eine Legende mit horizontalen Werten aus.