12
votes

alignement des parcelles non à facettes distinctes dans ggplot2 à l'aide de RPY2 en python

Je combine deux parcelles distinctes dans une disposition de grille avec grille code> comme suggéré par @lgautier dans RPY2 à l'aide de Python. La parcelle supérieure est une densité et et le graphique de barre inférieur: xxx pré>

Ce que je reçois est proche de ce que je veux, mais les parcelles ne sont pas exactement alignées (montrées par les flèches que j'ai ajoutées) : p>

Entrez la description de l'image ici p>

Je voudrais régions de parcelle (pas les légendes) pour correspondre exactement. Comment cela peut-il être atteint? La différence ici n'est pas si grosse mais que vous ajoutez des conditions au graphique à barres ci-dessous ou de les créer des graphiques à barres estimées avec position_dodge code> Les différences peuvent devenir très grandes et les parcelles ne sont pas alignées. p>

La solution GGPLOT standard ne peut pas être facilement traduite dans RPY2: P>

Arrangez code> apparaît code> grid_arrange code> dans grisextra : P>

Error: VECTOR_ELT() can only be applied to a 'list', not a 'double'
*** longjmp causes uninitialized stack frame ***: python2.7 terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f83742e2817]
/lib/x86_64-linux-gnu/libc.so.6(+0x10a78d)[0x7f83742e278d]
/lib/x86_64-linux-gnu/libc.so.6(__longjmp_chk+0x33)[0x7f83742e26f3]
...
7f837591e000-7f8375925000 r--s 00000000 fc:00 1977264                    /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7f8375926000-7f8375927000 rwxp 00000000 00:00 0 
7f8375927000-7f8375929000 rw-p 00000000 00:00 0 
7f8375929000-7f837592a000 r--p 00022000 fc:00 917959                     /lib/x86_64-linux-gnu/ld-2.15.so
7f837592a000-7f837592c000 rw-p 00023000 fc:00 917959                     /lib/x86_64-linux-gnu/ld-2.15.so
7ffff4b96000-7ffff4bd6000 rw-p 00000000 00:00 0                          [stack]
7ffff4bff000-7ffff4c00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)


10 commentaires

Ceux qui l'ont marqué comme un duplicata ont une appréciation nulle des subtilités de la traduction du code de RPY2. Oui, parfois la traduction est facile mais parfois elle est contre-intuitive. Ceci est une question RPY2. Pas une question de ggplot2 tout droit. Vous êtes juste interférant et bloquant le processus de question et de réponse sans bonne raison.


unité.pmax est une fonction distincte de l'unité (bien que les deux sont dans la grille grille ). Y a-t-il un grid.unit.pmax disponible en python après grille = importr ("grille") ? Ou fait-il rpy faire une translation sur des points dans les noms de fonction qui ne sont pas liés à la méthode S3 Dispatch?


@Briandiggs semble que grille :: unité.pmax deviendrait grid.unit_pmax


@baptiste: Vous avez raison, merci, mais je ne sais toujours pas comment accéder aux objets grob de RPY2, voir Modifications


J'ai bien peur que je ne puisse pas aider; Cette syntaxe RPY est complètement étrangère pour moi.


Quelle est la sortie de vos dernières commandes?


@baptiste: Réponse modifiée pour avoir des commandes. Je pense que je suis proche mais manque quelque chose de petit - peut-être passer par la valeur par rapport à la question de référence? pas certain


Il me semble que les champs de largeur de GA et GB n'ont pas été mis à jour sur les nouvelles valeurs de WA et WB.


@baptiste: Mais ressemble-t-il à wa et wb a été mis à jour correctement?


@ user248237dfsf - Segfault ne devrait pas arriver. L'avez-vous signalé sur le tracker d'émission pour RPY2?


3 Réponses :



6
votes

Aligner deux parcelles devient beaucoup plus difficile lorsque les facettes sont impliquées. Je ne sais pas s'il y a une solution générale, même dans R. Considérez ce scénario,

library(gtable)

# legend, if it exists, may be the second last item on the right, 
# unless it's not on the right side.
locate_guide <- function(g){
  right <- max(g$layout$r)
  gg <- subset(g$layout, (grepl("guide", g$layout$name) & r == right - 1L) | 
                 r == right)
  sort(gg$r)
}

compare_left <- function(g1, g2){

  w1 <- g1$widths[1:3]
  w2 <- g2$widths[1:3]
  unit.pmax(w1, w2)
}

align_lr <- function(g1, g2){

  # align the left side 
  left <- compare_left(g1, g2)
  g1$widths[1:3] <- g2$widths[1:3] <- left

  # now deal with the right side

  gl1 <- locate_guide(g1)
  gl2 <- locate_guide(g2)

  if(length(gl1) < length(gl2)){
    g1$widths[[gl1]] <- max(g1$widths[gl1], g2$widths[gl2[2]]) +
      g2$widths[gl2[1]]
  }
  if(length(gl2) < length(gl1)){
    g2$widths[[gl2]] <- max(g2$widths[gl2], g1$widths[gl1[2]]) +
      g1$widths[gl1[1]]
  }
  if(length(gl1) == length(gl2)){
    g1$widths[[gl1]] <-  g2$widths[[gl2]] <- unit.pmax(g1$widths[gl1], g2$widths[gl2])
  }

  grid.arrange(g1, g2)
}

align_lr(g1, g2)



1
votes

traduction non testée de la réponse à l'aide de gridextra code> 's grid.arrange () code>. Les côtés gauche des parcelles (où les étiquettes pour l'axe des Y sont) ne peuvent pas toujours être alignées cependant.

from rpy2.robjects.packages import importr
gridextra = importr('gridExtra')
from rpy2.robjects.lib import ggplot2
_ggplot2 = ggplot2.ggplot2
def dollar(x, name): # should be included in rpy2.robjects, may be...
    return x[x.index(name)]

def g_legend(a_gplot):
    tmp = _ggplot2.ggplot_gtable(_ggplot2.ggplot_build(a_gplot))
    leg = [dollar(x, 'name')[0] for x in dollar(tmp, 'grobs')].index('guide-box')
    legend = dollar(tmp, 'grobs')[leg]
    return legend
legend1 = g_legend(p1)
legend2 = g_legend(p2)
nolegend = ggplot2.theme(**{'legend.position': 'none'})
gridexta.grid_arrange(p1 + nolegend, legend1, 
                      p2 + nolegend, legend2,
                      ncol=2, widths = FloatVector((5.0/6,1.0/6)))


0 commentaires