2017-05-12 2 views
0

Ich möchte zwei Linien mit der gleichen X-Achse, aber unterschiedlichen Y-Achse zeichnen.geom_line mit unterschiedlicher y-Achsenskalierung

Die Konversation hier lesen geom_bar + geom_line: with different y-axis scale? Ich habe den folgenden Code erstellt, um visit_time und item_bought in derselben Grafik zu plotten. Ich habe es geschafft, die sekundäre Achse auf der rechten Seite zu erstellen, aber ich bin nicht in der Lage Farblegende und die y-Achse Etiketten (die man eine der linken funktioniert, aber nicht auf der rechten Seite)

temp <- data.frame 
(day = c("2017-01-01", "2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05", "2017-01-06" ,"2017-01-07" ,"2017-01-08", "2017-01-09", "2017-01-10", "2017-01-11", "2017-01-12", "2017-01-13", "2017-01-14", "2017-01-15", "2017-01-16", "2017-01-17", "2017-01-18", "2017-01-19", "2017-01-20", "2017-01-21", "2017-01-22", "2017-01-23"), 
        items =c(33,34,12,31,26,45,15,20,30,44,31,48,18,4,12,38,1,3,3,1,6,7,20), 
        visit_time =c(2, 1, 11, 12, 16, 20, 10, 6, 19, 22, 18, 22, 15, 1, 9, 23, 2, 4, 5, 2, 12, 4, 22)) 
temp$day <- as.Date(temp$day, "%Y-%m-%d") 

       p1 = ggplot(temp, aes(day, items)) + geom_line(colour="darkblue", size = 1) + 
        ylab("items") + 
        theme(legend.position="none",axis.text.x = element_text(angle = 90, hjust = 0), 
         panel.background = element_rect(fill = NA), 
         panel.grid = element_blank()) 

       p2 = ggplot(temp, aes(day, visit_time)) + geom_line(colour="darkorange3", size =1) + ylab("visit_time") + 
        theme(legend.position="none",axis.text.x = element_text(angle = 90, hjust = 0), 
         panel.background = element_rect(fill = NA), 
         panel.grid = element_blank()) 

       g1 <- ggplot_gtable(ggplot_build(p1)) 
       g2 <- ggplot_gtable(ggplot_build(p2)) 

       # overlap the panel of 2nd plot on that of 1st plot 
       pp <- c(subset(g1$layout, name == "panel", se = t:r)) 
       g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, 
            pp$l, pp$b, pp$l) 

       # axis tweaks 
       ia <- which(g2$layout$name == "axis-l") 
       ga <- g2$grobs[[ia]] 
       ax <- ga$children[[2]] 
       ax$widths <- rev(ax$widths) 
       ax$grobs <- rev(ax$grobs) 
       ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm") 
       g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1) 
       g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b) 

       # draw it 
       grid.draw(g) 

Ich bin hinzufügen Ich bin nicht sicher, ob dies der effizienteste Weg ist, daher bin ich froh, eine andere Methode zu haben. Solange ich zwei Zeilen habe und die y-Achsennamen auf beiden Seiten und die Farblegende lösche.

Vielen Dank im Voraus.

+2

[Dies ist die kanonische Frage] (https://stackoverflow.com/questions/3099219/plot-with-2-y-axes-one-y-axis-on-the-left-and- eine andere y-Achse-auf-der-rechten). Die kurze Antwort ist, dass du es nicht leicht machen kannst, weil Hadley denkt, dass es eine schlechte Idee ist, wie er in seiner Antwort dort erklärt. Er hat es seitdem für Umwandlungen ermöglicht, obwohl z.B. Celcius und Fahrenheit. Es kann, wie Sie gefunden haben, durch Gitter gehackt werden, aber es braucht etwas Arbeit. – alistaire

Antwort

2
dat <- temp %>% gather(y, val, items:visit_time) 

ggplot(dat, aes(day, val, colour=y)) + 
    geom_line(data=dat %>% filter(y=="items")) + 
    geom_line(data=dat %>% filter(y=="visit_time"), aes(y=val*2)) + 
    scale_y_continuous(sec.axis= sec_axis(~./2, name="visit_time")) 

enter image description here

ein scale_colour_manual Fügen Sie die Farbe anpassen, wenn Sie die Standardeinstellung zu mißfallen finden.

scale_colour_manual(values = c("darkblue", "darkorange3")) 
Verwandte Themen