2017-07-13 3 views
3

Ce que je veux faireChangement par défaut de largeur de geom_bar à un autre défaut

J'ai actuellement un thème personnalisé pour mes parcelles, et je veux avoir au-dessus de ce que certains paramètres prédéfinis pour tous les types de parcelles. Mon premier objectif est sur les graphiques à barres, où je veux changer la largeur par défaut.

La largeur par défaut de geom_bar dans ggplot2 est « Par défaut, réglé sur 90% de la résolution des données. » (http://ggplot2.tidyverse.org/reference/geom_bar.html).

Je voudrais changer cette valeur par défaut à 75%. Pour être clair, je ne suis pas intéressé à changer comme ceci:

geom_bar(stat='identity', width=0.75)

Parce que cela veut dire que je dois le préciser à chaque fois que je crée un graphique à barres. Je veux que ce soit le nouveau défaut.

Ce que j'ai essayé jusqu'à présent

J'ai essayé de changer la valeur par défaut de la largeur en utilisant ceci:

update_geom_defaults("bar", list(width=0.75))

Mais je reçois un message d'erreur: Error: Aesthetics must be either length 1 or the same as the data (964): width. Je pense que cela peut être dû au fait que la largeur est calculée sur la base de la résolution des données, qui n'est pas encore là au moment où j'appelle update_geom_defaults

De plus, j'ai aussi réalisé que width ne fait pas partie de les aes par défaut des barres:

GeomBar$default_aes 
* colour -> NA 
* fill  -> "grey35" 
* size  -> 0.5 
* linetype -> 1 
* alpha -> NA 

Mes questions sont les suivantes:

  • Où est cet ensemble par défaut de 90%? Puis-je le modifier de quelque façon que ce soit?
  • Sinon, existe-t-il un autre moyen de transmettre un ensemble prédéfini de paramètres à toutes les fonctions geom_ *?

Merci!

Répondre

3

La valeur par défaut est défini dans GeomBar:

GeomBar <- ggproto("GeomBar", GeomRect, 
    required_aes = c("x", "y"), 

    setup_data = function(data, params) { 
    data$width <- data$width %||% 
     params$width %||% (resolution(data$x, FALSE) * 0.9) ## <- right here 
    transform(data, 
     ymin = pmin(y, 0), ymax = pmax(y, 0), 
     xmin = x - width/2, xmax = x + width/2, width = NULL 
    ) 
    }, 

    draw_panel = function(self, data, panel_params, coord, width = NULL) { 
    # Hack to ensure that width is detected as a parameter 
    ggproto_parent(GeomRect, self)$draw_panel(data, panel_params, coord) 
    } 
) 

La ligne marquée utilise %||%, qui est utilisée pour définir une valeur par défaut dans le cas où params$width est NULL (qui est la valeur par défaut dans geom_bar, NULL signifie « régler à quelque chose de raisonnable pour moi ").

Il n'y a pas de manière sympa comme update_geom_defaults pour changer cela. Ce que vous pouvez faire, est de faire votre propre geom_bar comme ceci:

geom_bar75 <- function (..., width = 0.75) { 
    geom_bar(..., width = width) 
} 

Cela fonctionne très bien dans la plupart des cas, à savoir avec un axe x discret (car la résolution est alors 1).Pour les cas plus complexes, vous devrez peut-être ajuster ou redéfinir GeomBar lui-même.

ggplot(mpg, aes(class)) + geom_bar() 
ggplot(mpg, aes(class)) + geom_bar75() 

enter image description here

+1

Impressionnant! Fonctionne comme un charme. Merci! – agatheblues