2
votes

Alignement des étiquettes de l'axe y dans face_grid et ggplot?

En utilisant les fonctions ggplot et Faces_grid , j'essaye de créer une carte thermique. J'ai un axe y catégoriel et je veux que les étiquettes de l'axe y soient alignées à gauche. Lorsque j'utilise le thème (axis.text.y.left = element_text (hjust = 0)) , les étiquettes de chaque panneau sont alignées indépendamment. Voici le code:

#data
set.seed(1)
gruplar <- NA
for(i in 1:20) gruplar[i] <- paste(LETTERS[sample(c(1:20),sample(c(1:20),1),replace = T) ],
                                   sep="",collapse = "")

gruplar <- cbind(gruplar,anagruplar=rep(1:4,each=5))
tarih <- data.frame(yil= rep(2014:2019,each=12) ,ay =rep_len(1:12, length.out = 72))

gruplar <- gruplar[rep(1:nrow(gruplar),each=nrow(tarih)),]
tarih <- tarih[rep_len(1:nrow(tarih),length.out = nrow(gruplar)),]

grouped <- cbind(tarih,gruplar)
grouped$value <- rnorm(nrow(grouped))

#plot
p <- ggplot(grouped,aes(ay,gruplar,fill=value))
p <- p + facet_grid(anagruplar~yil,scales = "free",
                    space = "free",switch = "y") 
p <- p + theme_minimal(base_size = 14) +labs(x="",y="") + 
  theme(strip.placement = "outside",
        strip.text.y = element_text(angle = 90))
p <- p + geom_raster(aes(fill = value), na.rm = T)
p + theme(axis.text.y.left = element_text(hjust = 0, size=14))

Je sais qu'en mettant des espaces et en utilisant une police mono-espace je peux résoudre le problème, mais je dois utiliser la police 'Calibri Light'. P >


0 commentaires

3 Réponses :


0
votes

Cela semble être un bogue dans ggplot2, ou du moins ce que je considère comme un comportement indésirable / inattendu. Vous avez peut-être vu la approche suggérée ici , qui utilise un remplissage de chaîne une police mono-espace pour réaliser l'alignement.

C'est assez piraté, mais si vous devez réaliser un alignement en utilisant une police particulière, vous pouvez remplacer complètement les étiquettes des axes par geom_text . J'ai une solution qui fonctionne principalement, mais elle est moche, en ce sens que chaque étape semble casser quelque chose d'autre!

library(ggplot2); library(dplyr)

# To add a blank facet before 2014, I convert to character
grouped$yil = as.character(grouped$yil)

# I add some rows for the dummy facet, in year "", to use for labels
grouped <- grouped %>%
  bind_rows(grouped %>%
              group_by(gruplar) %>%
              slice(1) %>% 
              mutate(yil = "",
                     value = NA_real_) %>%
              ungroup())

p <- ggplot(grouped,
            aes(ay,gruplar,fill=value)) +
  geom_raster(aes(fill = value),na.rm = T) +
  scale_x_continuous(breaks = 4*0:3) +
  facet_grid(anagruplar~yil,
             scales = "free",space = "free",switch = "y") + 
  theme_minimal(base_size = 14) +
  labs(x="",y="") + 
  theme(strip.placement = "outside",
        strip.text.y = element_text(angle = 90),
        axis.text.y.left = element_blank(),
        panel.grid = element_blank()) +

  geom_text(data = grouped %>%
              filter(yil == ""),
            aes(x = -40, y = gruplar, label = gruplar), hjust = 0) +
  scale_fill_continuous(na.value = "white")
p

(Le dernier problème avec cette intrigue que je peux voir est qu'il montre un "0" orphelin sur l'axe des x de la facette factice. Besoin d'un autre hack pour s'en débarrasser!)

 entrez la description de l'image ici


0 commentaires

2
votes

Creuser dans grobs n'est pas mon hack préféré, mais il peut servir son objectif ici:

# generate plot
# (I used a smaller base_size because my computer screen is small)
p <- ggplot(grouped,aes(ay,gruplar,fill=value)) + 
  geom_raster(aes(fill = value),na.rm = T) + 
  facet_grid(anagruplar~yil,scales = "free",space = "free",switch = "y") + 
  labs(x="", y="") +
  theme_minimal(base_size = 10) +
  theme(strip.placement = "outside",
        strip.text.y = element_text(angle = 90),
        axis.text.y.left = element_text(hjust = 0, size=10))

# examine ggplot object: alignment is off
p 

# convert to grob object: alignment is unchanged (i.e. still off)
gp <- ggplotGrob(p)
dev.off(); grid::grid.draw(gp)

# change viewport parameters for left axis grobs
for(i in which(grepl("axis-l", gp$layout$name))){
  gp$grobs[[i]]$vp$x <- unit(0, "npc")     # originally 1npc
  gp$grobs[[i]]$vp$valid.just <- c(0, 0.5) # originally c(1, 0.5)
}

# re-examine grob object: alignment has been corrected
dev.off(); grid::grid.draw(gp)

 plot


0 commentaires

2
votes

Je suppose qu'une option consiste à dessiner les étiquettes sur le côté droit et à déplacer cette colonne dans la table gtable,

p <-ggplot(grouped,aes(ay,gruplar,fill=value)) + 
  facet_grid(anagruplar~yil,scales = "free",space = "free",switch = "y") + 
  geom_raster(aes(fill = value),na.rm = T) +
  theme_minimal(base_size = 12) + labs(x="",y="") +
  scale_y_discrete(position='right') +
  theme(strip.placement = "outside", strip.text.y = element_text(angle = 90))+ 
  theme(axis.text.y.left = element_text(hjust = 0,size=14))

g <- ggplotGrob(p)
id1 <- unique(g$layout[grepl("axis-l", g$layout$name),"l"])
id2 <- unique(g$layout[grepl("axis-r", g$layout$name),"l"])
g2 <- gridExtra::gtable_cbind(g[,seq(1,id1-1)],g[,id2], g[,seq(id1+1, id2-1)], g[,seq(id2+1, ncol(g))])

library(grid)
grid.newpage()
grid.draw(g2)


0 commentaires