2013-03-11 6 views
23

In meiner realen Forschungswelt ist es sehr üblich, die x-Achse oben (oder beide oben und unten) und y-Achse rechts anzuzeigen. Die Standardpositionen sind jedoch x auf der Unterseite und y auf der linken Seite in ggplot2.So ändern Sie die Positionen der x- und y-Achse in ggplot2

Kohske Post Here Im Anschluss an den verwendeten Befehle sind:

x <- seq(0, 10, 0.1) 
y <- sin(x * pi) 
qplot(x, y, geom = "line") + 
scale_x_continuous(guide = guide_axis(position = "top")) + 
scale_y_continuous(guide = guide_axis(position = "right")) 

Ich habe über Befehle in dev-Modus versucht:

install_packages("devtools") 
library(devtools) 
dev_mode() 
install_github("ggplot2", "kohske", "feature/pguide") 
library(ggplot2) 

Leider ist es nicht gut mit dem neuesten plyr Paket funktioniert. Nachrichten:

The following 'from' values not present in 'x': col, color, pch, cex, lty, lwd, srt, adj, bg, fg, min, max... 
Error in plyr:::split_indices(seq_len(nrow(data)), scale_id, n) 

Dann habe ich versucht, die codes from github directedly, die Nachrichten sind:

Error in continuous_scale(c("x", "xmin", "xmax", "xend", "xintercept"), : 
    formal argument "guide" matched by multiple actual arguments 

ich bemerkt habe, dass Hadley sagte diese Funktionalität auf seiner To-do-Liste. Ich konnte jedoch in diesem Moment keine Lösung finden. Könnte jemand helfen?

Antwort

8

ggplot2 Lösung

I This solution nehmen eine rechte Y-Achse zu erzeugen. Persönlich finde ich das Manipulieren von Grobs innerhalb eines gtable wirklich schwierig. Ich gebe mit der x-Achse auf, aber ich gebe eine Gitterlösung. Ich hoffe, dass diese Funktionalität so bald wie möglich in ggplot2 implementiert wird.

library(ggplot2) 
library(gtable) 
library(grid) 
grid.newpage() 
dat <- data.frame(x<-seq(0, 10, 0.1),y = sin(x * pi)) 
p <- ggplot(dat, aes(x, y)) + geom_line(colour = "blue") + theme_bw() 
# extract gtable 
g <- ggplot_gtable(ggplot_build(p)) 

# axis tweaks 
ia <- which(g$layout$name == "axis-l") 
ax <- g$grobs[[ia]]$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") 
pp <- c(subset(g$layout, name == "panel", select = t:r)) 
g <- gtable_add_cols(g, g$widths[g$layout[ia, ]$l], length(g$widths) - 1) 
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b) 
g$grobs[[ia]]$children[[2]] <- NULL 
############################## 
ia <- which(g$layout$name == "ylab") 
ylab <- g$grobs[[ia]] 
g <- gtable_add_cols(g, g$widths[g$layout[ia, ]$l], length(g$widths) - 1) 
g <- gtable_add_grob(g, ylab, pp$t, length(g$widths) - 1, pp$b) 
g$grobs[[ia]]$label = '' 
grid.draw(g) 

enter image description here

Gitterlösung

Dies ist keine ggplot2 Lösung, aber lattice ein. Unter Verwendung von latticeExtra mit einem ggplot2-Thema können wir ein ähnliches Aussehen mit dem gewünschten Verhalten erzielen.

library(latticeExtra) 
xyplot(y~ x, type='l', scales=list(x=list(alternating=2), 
            y=list(alternating=2)), 
     par.settings = ggplot2like(),axis=axis.grid) 

enter image description here

+4

„Ich hoffe, dass diese Funktionalität in ggplot2 umgesetzt werden so schnell wie möglich "- konnte mehr nicht zustimmen. Und ich denke auch, dass die Verwendung der gtable-Methode ziemlich schwierig ist. Gibt es eine Möglichkeit, die "viewport" -Methode (statt grid.draw) zu verwenden, um mehrere Diagramme mit der rechten y-Achse anzuordnen? – bearcat

+0

@bearcat Um mehrere Diagramme anzuordnen, ist es besser, etwas wie 'library (gridExtra); grid.arrange (g, g)' 'zu verwenden. Aber versuchen Sie 'Lattice'-Paket zu verwenden, sicherlich gibt es eine Lernkurve, aber es ist ein tolles Paket und gut dokumentiert. – agstudy

+0

Ich glaube, "Viewport" -Methode hat eine bessere Leistung für die spezifische Nutzung - zum Beispiel beim Versuch, Überlappung Sub-Plots auszulegen. Entschuldigung, ich warte nur auf eine klarere und einfachere Lösung. – bearcat

8

Von ggplot 2.2.0 Sie die Position der Achsen mit dem position Argument in scale_ einstellen:

ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    scale_x_continuous(position = "top") + 
    scale_y_continuous(position = "right") 

enter image description here

Verwandte Themen