2016-01-06 6 views
5

Ich versuche, ein Balkendiagramm mit plotly in R zu erzeugen. Die Balken sollten nach Wert sortiert werden und es gibt zwei Klassen von Balken, die ich anders färben möchte. Wenn ich jedoch die Farbe hinzufüge, werden die Balken in zwei Gruppen aufgeteilt, die innerhalb von Gruppen sortiert sind. Irgendein Hinweis darauf, wie ich sie in einer Gruppe halten kann?Farbe in Plot Balkendiagramm

Hier ist mein Code:

plotting.df = data.frame(names=c("a", "b", "c", "d", "e", "f", "g"), 
         value=c(1.9468656, 1.3867055, 1.0433950, 0.8949743, 0.3714826, 0.3605037, 0.3003954), 
         label=c("y", "n", "y", "n", "n", "n", "n"), 
         color=c("red", "black", "red", "black", "black", "black", "black")) 
plotting.df$names = factor(as.character(plotting.df$names), levels=as.character(plotting.df$names)[order(plotting.df$value, decreasing=TRUE)]) 
plotting.df = plotting.df[order(plotting.df$value, decreasing=TRUE), ] 
plot_ly(plotting.df, type="bar", x=names, y=value, 
     name="Comp a", 
     hoverinfo="text", text=c(paste("Name:", plotting.df$names, 
             "<br>Value:", signif(plotting.df$value, digits=3), 
             "<br>Label:", plotting.df$label)), 
     color=color) 

Und ein Beispiel:

enter image description here

+1

interessante Frage, aber da Sie runif() verwenden, sollten Sie Samen setzen, weil wir nicht in der Lage sein werden, Ihre Handlung – MLavoie

+0

Guter Punkt zu reproduzieren. Ich habe runif durch tatsächliche Werte ersetzt. Die genauen Werte spielen in diesem Fall keine Rolle. –

Antwort

1

Es ist ein bisschen wie ein Hack, aber diese 'löst' die spezifische Frage gefragt.

Beginnend mit dem Datenrahmen:

library(tidyr) 

    plotting.df2 <- plotting.df %>% 
     spread(names, value, fill = NA) %>% 
     gather("names", "value", a:g) 

    plot_ly(plotting.df2, 
     type="bar", 
     x=names, 
     y=value, 
     name="Comp a", 
     hoverinfo="text", 
     color=color, 
     text=c(paste("Name:", plotting.df$names, 
        "<br>Value:", signif(plotting.df$value, digits=3), 
        "<br>Label:", plotting.df$label))) %>% 
    layout(barmode = "stack") 

Grundsätzlich ist dieses Verfahren einen Datenpunkt für jede Kombination von Namen und die Farbe wird zu schaffen, mit NAs gefüllt. Dann sind diese in der Handlung gestapelt.

Diese 'Lösung' ist wahrscheinlich nutzlos, wenn Sie später Datenwerte tatsächlich stapeln wollen, aber hoffentlich wird dieser Hack jemanden zumindest vorübergehend aus einem ähnlichen Loch herausholen.

EDIT: Dieses Beispiel verwendet plotly 3.x.x. Wenn Sie plotly 4.x.x oder höher verwenden, funktioniert dieser Code möglicherweise nicht so wie er ist. Hier finden Sie weitere Details: https://www.r-bloggers.com/upgrading-to-plotly-4-0-and-above/

+0

Danke für die Lösung. Es sieht tatsächlich gleich aus ohne '%>% layout (barmode =" stack ")'. Aber ich muss jetzt keine anderen Daten stapeln –