web-dev-qa-db-fra.com

Modification de l'apparence de la taille des étiquettes de facette

Je sais que la question a été posée ici: Existe-t-il un moyen d'augmenter la hauteur de la barre strip.text dans une facette?

Je souhaite diminuer la hauteur de la barre strip.text sans modifier la taille du texte. Dans le cas actuel, il reste toujours un espace entre le texte et les murs de la barre de bande.

Voici ce que j'ai essayé jusqu'à présent,

library(gcookbook) # For the data set
library(ggplot2)

ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") +
facet_grid(.~ Date) +
theme(strip.text = element_text(face="bold", size=9,lineheight=5.0),
strip.background = element_rect(fill="lightblue", colour="black",
size=1))

Dans mon cas, il semble que lineheight n'affecte rien même s'il est changé en 5. Pourquoi?
Comment puis-je réduire la taille de la barre de bande tout en conservant la même taille de texte?

enter image description here

modifier après la réponse de @Sandy Muspratt

nous pouvons réduire la taille de la bande s'il n'y a qu'une seule ligne de facets.

g = ggplotGrob(p)
g$heights[c(3)] = unit(.4, "cm")  # Set the height

grid.newpage()
grid.draw(g)

enter image description here

Cependant, dans mes données réelles, j'ai de nombreuses lignes de tracé comme ci-dessous et quand j'ai changé les éléments de g $ heights, rien ne s'est passé!

p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") +
  facet_wrap(~ Date,ncol = 1) +
  theme(strip.text = element_text(face="bold", size=9),
        strip.background = element_rect(fill="lightblue", colour="black",size=1))

enter image description here

 g = ggplotGrob(p)
g$heights
#    [1] 5.5pt               0cm                 0.66882800608828cm  #1null               0cm                 0.193302891933029cm
#     [7] 0.66882800608828cm  1null               0cm                 #0.193302891933029cm 0.66882800608828cm  1null              
#    [13] 0.456194824961948cm 0cm                 1grobheight         5.5pt

alors j'ai essayé de changer 1,7 and 11 éléments

g$heights[c(3,7,11)] = unit(.4, "cm")  # Set the height

grid.newpage()
grid.draw(g)

enter image description here

Aucun changement dans la taille de l'étiquette de facette.

> g$heights
 [1] 5.5pt                                                       1grobheight                                                
 [3] sum(0.2cm, sum(0.15cm, 0.8128cm, 0cm, 0.15cm), 0.2cm)+0.2cm 0.2                                                        
 [5] 1null                                                       0cm                                                        
 [7] 0.193302891933029cm                                         0.2                                                        
 [9] 1null                                                       0cm                                                        
[11] 0.193302891933029cm                                         0.2                                                        
[13] 1null                                                       0cm                                                        
[15] 0.193302891933029cm                                         0.2                                                        
[17] 1null                                                       0.456194824961948cm                                        
[19] 0cm                                                         1grobheight                                                
[21] 5.5pt  
12
Alexander

Utiliser les marges

Depuis environ ggplot2 ver 2.1.0: Dans theme, spécifiez les marges dans le strip_text élément (voir ici ).

library(ggplot2)
library(gcookbook) # For the data set

p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") +
facet_grid(. ~ Date) +
theme(strip.text = element_text(face="bold", size=9),
strip.background = element_rect(fill="lightblue", colour="black",size=1))

  p +
  theme(strip.text.x = element_text(margin = margin(.1, 0, .1, 0, "cm")))



La réponse d'origine mise à jour vers ggplot2 v2.2.0

Votre graphique facet_grid

Cela réduira la hauteur de la bande (jusqu'à la hauteur zéro si vous le souhaitez). La hauteur doit être réglée pour une bande et trois grobs. Cela fonctionnera avec votre exemple de facet_grid spécifique.

library(ggplot2)
library(grid)
library(gtable)
library(gcookbook) # For the data set

p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") +
facet_grid(. ~ Date) +
theme(strip.text = element_text(face="bold", size=9),
strip.background = element_rect(fill="lightblue", colour="black",size=1))

g = ggplotGrob(p)

g$heights[6] = unit(0.4, "cm")  # Set the height

for(i in 13:15) g$grobs[[i]]$heights = unit(1, "npc") # Set height of grobs

grid.newpage()
grid.draw(g)

Votre graphique Facet_wrap

Il y a trois bandes sur la page. Par conséquent, il y a trois hauteurs de bande à changer et les trois hauteurs de grob à changer.

Ce qui suit fonctionnera avec votre exemple de facet_wrap spécifique.

p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") +
  facet_wrap(~ Date,ncol = 1) +
  theme(strip.text = element_text(face="bold", size=9),
        strip.background = element_rect(fill="lightblue", colour="black",size=1))

g = ggplotGrob(p)

for(i in c(6,11,16)) g$heights[[i]] = unit(0.4,"cm")   # Three strip heights changed
for(i in c(17,18,19)) g$grobs[[i]]$heights <-  unit(1, "npc")   # The height of three grobs changed

grid.newpage()
grid.draw(g)

Comment trouver les hauteurs et les grobs pertinents?

g$heights renvoie un vecteur de hauteurs. Les hauteurs nulles sont les panneaux de tracé. Les hauteurs de bande sont un avant - c'est-à-dire 6, 11, 16.

g$layout renvoie un bloc de données avec les noms des grobs dans la dernière colonne. Les grobs dont la hauteur doit être modifiée sont ceux dont le nom commence par "strip". Ils sont dans les rangées 17, 18, 19.

Pour généraliser un peu

p = ggplot(cabbage_exp, aes(x=Cultivar, y=Weight)) + geom_bar(stat="identity") +
  facet_wrap(~ Date,ncol = 1) +
  theme(strip.text = element_text(face="bold", size=9),
        strip.background = element_rect(fill="lightblue", colour="black",size=1))

g = ggplotGrob(p)

# The heights that need changing are in positions one less than the plot panels
pos =  c(subset(g$layout, grepl("panel", g$layout$name), select = t))
for(i in pos) g$heights[i-1] = unit(0.4,"cm")

# The grobs that need their heights changed:
grobs = which(grepl("strip", g$layout$name))
for(i in grobs) g$grobs[[i]]$heights <-  unit(1, "npc")      
grid.newpage()
grid.draw(g)

Plusieurs panneaux par ligne

Presque le même code peut être utilisé, même avec un titre et une légende positionnés en haut. Il y a un changement dans le calcul de pos, mais même sans ce changement, le code s'exécute.

library(ggplot2)
library(grid)

# Some data
df = data.frame(x= rnorm(100), y = rnorm(100), z = sample(1:12, 100, T), col = sample(c("a","b"), 100, T))

# The plot
p = ggplot(df, aes(x = x, y = y, colour = col)) +
   geom_point() +
   labs(title = "Made-up data") + 
   facet_wrap(~ z, nrow = 4) +
   theme(legend.position = "top")

g = ggplotGrob(p)

# The heights that need changing are in positions one less than the plot panels
pos =  c(unique(subset(g$layout, grepl("panel", g$layout$name), select = t)))
for(i in pos) g$heights[i-1] = unit(0.2, "cm")

# The grobs that need their heights changed:
grobs = which(grepl("strip", g$layout$name))
for(i in grobs) g$grobs[[i]]$heights <-  unit(1, "npc") 

grid.newpage()
grid.draw(g)
14
Sandy Muspratt