2013-03-09 18 views
6

Mam domyślną legendę opartą na współczynniku kolumny. Zmieniłem oś X na podstawie współczynnika innej kolumny.Dodaj drugą legendę na wykresie w R

Czy mogę dodać legendę również dla tego koloru osi X?

enter image description here

scalone dane (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 

Kod

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

można wyświetlić kod został użyty do wygenerowania tego –

+0

@David (najlepiej w powtarzalny przykład?): Mam załączeniu dataframe. Czy nadal występują problemy z danymi? – unj2

+0

@ kunj2aan, kiedy skopiujesz dokładnie to, co wkleiłeś podczas nowej sesji R, czy uda ci się uzyskać fabułę bez błędów? – Arun

Odpowiedz

1

To rozwiązanie nie jest tak wszechstronny, jak możemy chcieć, ale też nie jest bardzo trudne i techniczne. Pierwsza część danych:

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

Popularnym funkcja g_legend (można znaleźć, na przykład here) jest przydatny w tym przypadku, że ma legendę z wykresu jako Grob (dlatego to rozwiązanie nie jest szybko).

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 
} 

więc zapisać dwie legendy, jeden dla punktów (x) oraz jeden dla osi 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)]))) 

Zauważ różnicę w drugiej legendzie. palette() jest tu używany, ponieważ jeśli np. z <- factor(c(1, 2, 3)), a następnie element_text(color = z) używa kolorów innych niż geom_point(aes(color = z)), tj. element_text(color = z) pobiera kolory z wykresu bazowego, np. 2 w plot(1, col = 2).

Wreszcie, stawiając wszystko razem:

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

Powiązane problemy