2017-12-30 13 views
0

Wahrscheinlich ein einfacher.Hinzufügen von Farbe und Blase Größenlegende in R plotly

Ich habe ein xy-Dataset, das ich plotten möchte R 's plotly. Hier sind die Daten:

set.seed(1) 
df <- data.frame(x=1:10,y=runif(10,1,10),group=c(rep("A",9),"B"),group.size=as.integer(runif(10,1,10))) 

Ich mag würde die Daten von df$group und haben die Größe der Punkte folgen df$group.size (das heißt, ein Blasendiagramm) färben. Außerdem hätte ich gerne beide Legenden hinzugefügt.

Das ist mein naiver Versuch:

require(plotly) 
require(dplyr) 

    main.plot <- 
plot_ly(type='scatter',mode="markers",color=~df$group,x=~df$x,y=~df$y,size=~df$group.size,marker=list(sizeref=0.1,sizemode="area",opacity=0.5),data=df,showlegend=T) %>% 
    layout(title="Title",xaxis=list(title="X",zeroline=F),yaxis=list(title="Y",zeroline=F)) 

, die als herauskommt: enter image description here

und leider die Legende vermasselt, zumindest, wie ich will es sein: ein Punkt für jede Gruppe die gleiche Größe, aber verschiedene Farben.

legend.plot <- plot_ly() %>% add_markers(x = 1, y = unique(df$group.size), 
           size = unique(df$group.size), 
           showlegend = T, 
           marker = list(sizeref=0.1,sizemode="area")) %>% 
    layout(title="TITLE",xaxis = list(zeroline=F,showline=F,showticklabels=F,showgrid=F), 
      yaxis=list(showgrid=F)) 

, die kommt als: enter image description here

Hier mein Problem ist, dass die Legende einschließlich Werte

Dann eine Legende für die group.size Ich folgte this, auch durch aocall Antwort geholfen hinzufügen das gibt es nicht in meinen Daten.

dann kombiniere ich sie subplot mit: entfällt enter image description here

wo die Legende Titel, den ich für etwas Hilfe hilfreich wäre so

:

subplot(legend.plot, main.plot, widths = c(0.1, 0.9)) 

ich diese bekommen.

+2

Haben Sie das gesehen? https://stackoverflow.com/questions/47383244/size-legend-for-plotly-bubble-map-chart –

+0

Versucht es und aktualisiert meine Frage entsprechend – dan

Antwort

1

Basierend auf der aktualisierten Anfrage:

Beachten Sie die Änderungen in legend.plot (Abbildungswerten in eine Folge von ganzen Zahlen, dann die Achse tick Text manuell zu ändern), und die Verwendung von Anmerkungen, um einen Legendentitel zu erhalten. Wie erläutert in this answer, kann nur ein Titel verwendet werden, unabhängig davon, wie viele Unterplots verwendet werden.

Der Kreis in der Plot-Legende scheint der minimalen Punktgröße jeder Kurve zu entsprechen. Daher habe ich einen Punkt bei (12, 12) hinzugefügt und den Bereich der Achsen eingeschränkt, um sicherzustellen, dass er nicht angezeigt wird.

titleX und titleY steuern die Anzeige von Achsenbeschriftungen, wie erklärt here.

set.seed(1) 
df <- data.frame(x=1:10,y=runif(10,1,10),group=c(rep("A",9),"B"),group.size=as.integer(runif(10,1,10))) 
require(plotly) 
require(dplyr) 


## Take unique values before adding dummy value 
unique_vals <- unique(df$group.size) 
df <- rbind(c(12, 12, "B", 1), df) 
df[c(1, 2, 4)] <- lapply(df[c(1, 2, 4)], as.numeric) 


main.plot <- 
    plot_ly(type='scatter', 
    mode="markers", 
    color=~df$group, 
    x=~df$x, 
    y=~df$y, 
    size=~df$group.size, 
    marker=list(
     sizeref=0.1, 
     sizemode="area", 
     opacity=0.5), 
     data=df, 
     showlegend=T) %>% 
    layout(title="Title", 
    xaxis=list(title="X",zeroline=F, range=c(0, 11)), 
    yaxis=list(title="Y",zeroline=F, range=c(0, 11))) 

legend.plot <- plot_ly() %>% 
    add_markers(x = 1, 
    y = seq_len(length(unique_vals)), 
    size = sort(unique_vals), 
    showlegend = F, 
    marker = list(sizeref=0.1,sizemode="area")) %>% 
    layout(
     annotations = list(
      list(x = 0.2, 
       y = 1, 
       text = "LEGEND TITLE", 
       showarrow = F, 
       xref='paper', 
       yref='paper')), 
     xaxis = list(
      zeroline=F, 
      showline=F, 
      showticklabels=F, 
      showgrid=F), 
     yaxis=list(
      showgrid=F, 
      tickmode = "array", 
      tickvals = seq_len(length(unique_vals)), 
      ticktext = sort(unique_vals))) 


subplot(legend.plot, main.plot, widths = c(0.1, 0.9), 
    titleX=TRUE, titleY=TRUE) 
+0

Danke nochmal. Die Legende von main.plot hat immer noch einen blauen Kreis um sie herum. Hast du das bemerkt? – dan

+0

Ein weiteres Problem ist, dass die Legende die Achsenbeschriftungen beseitigt – dan

+0

Ich habe den Code aktualisiert, um diese Probleme zu beheben – aocall

1

Zunächst geben Sie nur die eindeutigen Werte an die Legende weiter. Wenn Sie alle möglichen Werte übergeben (zB seq(min(x), max(x), by=1), oder in diesem Fall seq_len(max(x))), zeigt die Legende den vollen Bereich an.

Zweitens, sizeref und sizemode in der Argument ändern, wie die Punktgröße berechnet wird. Das folgende Beispiel soll eine einheitlichere Plot erzeugen:

set.seed(1) 
df <- data.frame(x=1:10,y=runif(10,1,10),group=c(rep("A",9),"B"),group.size=as.integer(runif(10,1,10))) 

require(plotly) 
require(dplyr) 

a <- plot_ly(type='scatter',mode="markers", 
    color=~df$group, 
    x=~df$x, 
    y=~df$y, 
    size=df$group.size, 
    marker = list(sizeref=0.1, sizemode="area"), 
    data=df, 
    showlegend=F) %>% 
    layout(title="Title", 
     xaxis=list(title="X",zeroline=F), 
     yaxis=list(title="Y",zeroline=F)) 

b <- plot_ly() %>% add_markers(x = 1, y = seq_len(max(df$group.size)), 
    size = seq_len(max(df$group.size)), 
    showlegend = F, 
    marker = list(sizeref=0.1, sizemode="area")) %>% 
    layout(
     xaxis = list(zeroline=F,showline=F,showticklabels=F,showgrid=F), 
     yaxis=list(showgrid=F)) 


subplot(b, a, widths = c(0.1, 0.9)) 
+0

Danke @aocall. Der Grund, warum ich die eindeutigen Werte übergeben habe, ist, dass ich nicht glaube, dass Kreisbereiche, die in meinen Daten nicht existieren, in der Legende dargestellt werden sollten - ich meine, warum würde eine Legende Merkmale beschreiben, die nicht in den Daten enthalten sind. Aber scheint plotly die Werte dieser unabhängig zu zeigen. Recht? – dan

+0

Sorry, ich missverstanden. Ich denke, es ist eine Geschmackssache, aber ich würde die gesamte Palette von Größen zeigen, nicht nur die, die auftreten. Wenn Sie die auf der y-Achse der Legende angezeigten Werte ändern möchten (nur die eindeutigen Werte anzeigen), müssen Sie das Teilplotting etwas genauer anpassen. – aocall

+0

Es ist in Ordnung. Ihre Antwort war hilfreich. Ich habe die Frage bearbeitet, indem ich deinen Code integriert habe, da es noch ein paar weitere Elemente gibt, mit denen ich Hilfe benötige. – dan