ggplot2: Ajout secondaire transformée de l'axe des x sur le haut de la parcelle
[ Edition avril 2016: la solution dans ce thread n'affiche plus l'ajout de l'axe correctement - un nouveau fil de discussion sur ce sujet a été ouvert à la ggplot2 2.1.0 cassé mon code? Secondaire transformée axe maintenant s'affiche de façon incorrecte ]
Je suis en train de travailler à l'échelle x données, et la nécessité d'ajouter un non mis à l'échelle de l'axe x vers le haut de la parcelle pour en faciliter l'interprétation. Je suis venu à travers une approche pour l'ajout d'un secondaire un axe des y à Comment puis-je mettre une échelle transformée sur le côté droit d'un ggplot2?. Cependant, je ne peux pas le faire fonctionner correctement pour l'axe des abscisses. Je suis sûr que je ne suis pas la compréhension de certaines parties du code, mais je n'arrive pas à comprendre ce que c'est. J'ai essayé de regarder dans le ggplot2 fichiers d'aide, et aussi le Wickham livre ggplot2: Élégant Graphiques Pour l'Analyse de Données, mais si quelqu'un peut me diriger vers certains documents pertinents, je voudrais vraiment l'apprécier!
Je suis en train de travailler avec les données de température, mais je vais utiliser le lac des données à partir du lien ci-dessus que le code a été écrit pour que. Voici l'original du code à partir de ce lien:
library(ggplot2)
library(gtable)
library(grid)
LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)
p1 <- ggplot(data=LakeLevels) + geom_line(aes(x=Day,y=Elevation)) +
scale_y_continuous(name="Elevation (m)",limits=c(75,125))
p2<-ggplot(data=LakeLevels)+geom_line(aes(x=Day, y=Elevation))+
scale_y_continuous(name="Elevation (ft)", limits=c(75,125),
breaks=c(80,90,100,110,120),
labels=c("262", "295", "328", "361", "394"))
#extract gtable
g1<-ggplot_gtable(ggplot_build(p1))
g2<-ggplot_gtable(ggplot_build(p2))
#overlap the panel of the 2nd plot on that of the 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)
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)
De tester une méthode pour l'ajout d'un axe x à la place de l'axe des y, j'ai changé les axes x et y et changé axis-l
à axis-b
à donner:
library(ggplot2)
library(gtable)
library(grid)
LakeLevels<-data.frame(Day=c(1:365),Elevation=sin(seq(0,2*pi,2*pi/364))*10+100)
p1 <- ggplot(data=LakeLevels) + geom_line(aes(x=Elevation,y=Day)) +
scale_x_continuous(name="Elevation (m)",limits=c(75,125))
p2<-ggplot(data=LakeLevels)+geom_line(aes(x=Elevation, y=Day))+
scale_x_continuous(name="Elevation (ft)", limits=c(75,125),
breaks=c(80,90,100,110,120),
labels=c("262", "295", "328", "361", "394"))
#extract gtable
g1<-ggplot_gtable(ggplot_build(p1))
g2<-ggplot_gtable(ggplot_build(p2))
#overlap the panel of the 2nd plot on that of the 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)
ia <- which(g2$layout$name == "axis-b")
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)
Ce produit l'axe des x, mais il ya un couple de problèmes:
1) c'est dans le milieu de l'intrigue
2) il n'est pas de produire un nouveau x-label de "l'Altitude (ft)"
J'ai besoin de l'axe s'affiche en haut de l'intrigue, et j'ai besoin d'un associé des étiquettes de l'axe. Quelqu'un peut-il me dire ce que je fais de mal?
Aussi, comme mentionné ci-dessus, je suis en train de travailler à l'échelle des données de température, donc, idéalement, les tiques ne serait pas aligner sur le haut et le bas axes comme dans cet exemple. Est-il un moyen de le faire dans ggplot2? Un exemple au hasard à partir du web est: est-ce
OriginalL'auteur Thomas | 2014-01-09
Vous devez vous connecter pour publier un commentaire.
La racine de votre problème est que vous êtes à la modification de colonnes et de ne pas les lignes.
L'installation, à l'échelle des étiquettes sur l'axe des X de la deuxième parcelle:
MODIFIER d'avoir les lignes de la grille aligner avec la partie inférieure de l'axe tiques, remplacer la ligne ci-dessus avec:
g <- gtable_add_grob(g1, g1$grobs[[which(g1$layout$name=="panel")]], pp$t, pp$l, pp$b, pp$l)
Maintenant, vous devez vous assurer que vous êtes en train de modifier la dimension adéquate. Parce que le nouvel axe est horizontal (une ligne et non une colonne),
whatever_grob$heights
est le vecteur de modifier la quantité d'espace vertical dans une ligne donnée. Si vous voulez ajouter un nouvel espace, assurez-vous d'ajouter une ligne et non une colonne (ie. utilisationgtable_add_rows()
).Si vous modifiez les grobs eux-mêmes (dans ce cas, nous sont en train de changer la justification verticale des tiques), assurez-vous de modifier le
y
(position verticale) plutôt que dex
(position horizontale).Je note en passant que
gtable_show_layout()
est un très, fonction très pratique pour comprendre ce qui se passe.J'ai été en mesure de résoudre le problème de l'échelle d'incompatibilité entre les axes, en calculant d'abord la gamme appropriée pour chaque axe, et le réglage est à l'aide de +scale_x_continuous(limite = c(x1, x2)). Espérons que cela est utile à quelqu'un.
J'ai remarqué que les lignes de la grille et des données dans la parcelle sont de nouveau en haut de l'axe, pas le bas de l'axe. Est-il possible d'utiliser les lignes de grille et de données à partir de l'axe du bas?
Oui vous avez juste besoin de changement au niveau de la parcelle que vous superposez. Ainsi le changement de la ligne
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name=="panel")]], pp$t, pp$l, pp$b, pp$l)
:g <- gtable_add_grob(g1, g1$grobs[[which(g1$layout$name=="panel")]], pp$t, pp$l, pp$b, pp$l)
Bonjour Nate Pape, j'ai repris ce code à l'aide de la version actuelle de ggplot2, mais les étiquettes de l'axe pour le haut de l'axe des x est maintenant écrêtage (presque comme si le fond blanc de hauteur n'est pas ajusté). En outre, les étiquettes de graduation sont superposées les tiques. Je soupçonne qu'il ya un problème avec les "hauteurs"... une chance que vous pourriez être en mesure de jeter un peu de lumière sur ce problème? J'ai ouvert une nouvelle question dans le stackoverflow.com/questions/36487283/...
OriginalL'auteur Nate Pope