2016-01-06 16 views
5

Sto provando a generare un grafico a barre utilizzando la trama in R. Le barre dovrebbero essere ordinate per valore e ci sono due classi di barre, che voglio colorare in modo diverso. Tuttavia, quando aggiungo il colore, le barre sono divise in due gruppi, ordinate all'interno di gruppi. Qualche suggerimento su come posso mantenerli in un gruppo?Colore nell'istogramma grafico lineare

Ecco il mio codice:

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) 

E un esempio:

enter image description here

+1

domanda interessante, ma dal momento che stai usando runif() devi impostare seme perché non saremo in grado di riprodurre la tua trama – MLavoie

+0

Buon punto. Ho sostituito runif con valori reali. In questo caso, i valori esatti non contano. –

risposta

1

E 'un po' di hack, ma questo il problema specifico 'risolve' chiesto.

partire con la cornice di dati:

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") 

Fondamentalmente questo metodo è la creazione di un punto dati per ogni combinazione di nome e il colore, pieno di AN. Quindi questi sono impilati nella trama.

Questa 'soluzione' è probabilmente inutile se si desidera effettivamente impilare i valori dei dati in un secondo momento, ma si spera che questo trucco possa far uscire qualcuno da un buco simile almeno temporaneamente.

MODIFICA: Questo esempio utilizza plotly 3.x.x. Se si utilizza plotly 4.x.xo sopra, questo codice potrebbe non funzionare così com'è. Vedi qui per maggiori dettagli: https://www.r-bloggers.com/upgrading-to-plotly-4-0-and-above/

+0

Grazie per la soluzione. In realtà appare lo stesso senza '%>% layout (barmode =" stack ")'. Ma per ora non ho bisogno di impilare altri dati –