2013-03-09 7 views
6

Ho ottenuto la legenda predefinita basata su un fattore di una colonna. Ho colorato l'asse x in base a un fattore di un'altra colonna.Aggiungere una seconda legenda nella trama in R

Posso aggiungere anche una legenda per questo colore dell'asse x?

enter image description here

dati uniti (https://dl.dropbox.com/u/81597211/Untitled.pdf)

row.names LCA_CASE_WORKLOC1_CITY LCA_CASE_JOB_TITLE LCA_CASE_WORKLOC1_STATE LCA_CASE_WAGE_RATE_FROM Company 
    4726 REDWOOD SHORES SOFTWARE DEVELOPER - ARCHITECT CA 263500.00 ORACLE 
    102663 DENVER SOFTWARE ENGINEER (SOFTWARE DEVELOPER 5) CO 170000.00 ORACLE 
    103621 DENVER SOFTWARE ENGINEER (SOFTWARE DEVELOPER 5) CO 170000.00 ORACLE 
    95210 SANTA CLARA SOFTWARE ENGINEER (SOFTWARE DEVELOPER 4) CA 155000.00 ORACLE 
    18858 SANTA CLARA SOFTWARE ENGINEER (CONSULTING SOLUTION DIRECTOR) CA 150000.00 ORACLE 
    19514 IRVING CONSULTING TECHNICAL MANAGER TX 150000.00 ORACLE 
    57054 REDWOOD SHORES SOFTWARE ENGINEER (SOFTWARE DEVELOPER 4) CA 150000.00 ORACLE 
    76335 REDWOOD SHORES SOFTWARE ENGINEER (APPLICATIONS DEVELOPER 4) CA 150000.00 ORACLE 
    79964 REDWOOD SHORES SOFTWARE ENGINEER (SOFTWARE DEVELOPER 5) CA 150000.00 ORACLE 

Codice

library("ggplot2") 
colour = factor(merged$Company) 
xcolor = factor(merged$LCA_CASE_WORKLOC1_STATE) 
qplot(merged[[2]], merged[[4]], colour = colour, xlab="Positions", ylab ="Salary", main="H1B Salary 2012") + theme(axis.text.x=element_text(angle=90,vjust=0.5, hjust=1, size=10, color= xcolor, lineheight=10)) + scale_y_continuous(breaks=seq(0,300000, 10000)) + theme(panel.grid.minor = element_line(colour = "red", linetype = "dotted")) + scale_x_discrete(merged[[2]]) 
+2

si può mostrare il codice utilizzato per generare questo –

+0

@ David (preferibilmente in un esempio riproducibile?): Ho allegato il dataframe. Hai ancora problemi con i dati? – unj2

+0

@ kunj2aan, quando copi esattamente ciò che hai incollato su una nuova sessione R, riesci a ottenere la trama senza errori? – Arun

risposta

1

Questa soluzione non è versatile come si potrebbe desiderare, ma anche non è molto difficile e tecnico. Prima alcuni dati:

y <- c(5, 2, 3, 2) 
x <- factor(c("A", "B", "C", "A")) 
z <- factor(c("D", "E", "F", "E")) 

p <- qplot(x, y, geom = "point") + 
    theme(axis.text.x = element_text(color = z)) 

Una funzione popolare g_legend (si possono trovare ad esempio here) è utile in questo caso, ci vuole un legenda da una trama come grob (quindi questa soluzione non è veloce).

g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    legend 
} 

Così risparmiamo due leggende, una per i punti (x) e uno per l'asse x (z).

legends <- list(g_legend(p + geom_point(aes(color = x))), 
       g_legend(p + geom_point(aes(color = z)) + 
          scale_color_manual(values = palette()[as.numeric(z)]))) 

Notare una differenza nella seconda legenda. palette() viene utilizzato qui perché se ad es. z <- factor(c(1, 2, 3)) quindi element_text(color = z) utilizza colori diversi da geom_point(aes(color = z)), ad esempio element_text(color = z) prende i colori dal grafico di base come ad es. 2 in plot(1, col = 2).

Infine, mettendo tutto insieme:

library(gridExtra) 
grid.arrange(p + geom_point(aes(color = x)) + guides(color = 'none'), 
      do.call(arrangeGrob, legends), nrow = 1, widths = c(0.8, 0.2)) 

enter image description here