Supprimer la grille, la couleur d'arrière-plan et les bordures supérieure et droite de ggplot2

104

Je voudrais reproduire l'intrigue immédiatement ci-dessous en utilisant ggplot2. Je peux m'approcher, mais je ne peux pas supprimer les bordures supérieure et droite. Ci-dessous, je présente plusieurs tentatives d'utilisation de ggplot2, y compris plusieurs suggestions trouvées sur ou via Stackoverflow. Malheureusement, je n'ai pas été en mesure de faire fonctionner ces suggestions.

J'espère que quelqu'un pourra corriger un ou plusieurs des extraits de code ci-dessous.

Merci pour vos suggestions.

# desired plot
a <- seq(1,20)
b <- a^0.25
plot(a,b, bty = "l")


library(ggplot2)

df <- as.data.frame(cbind(a,b))

# 1. ggplot2 default
ggplot(df, aes(x = a, y = b)) + geom_point()

# 2. removes background color
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black'))

# 3. also removes gridlines
none <- theme_blank()
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none)

# 4. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.border = none)

# 5. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(axis.line = theme_segment())

# 6. removes x and y axis in addition to top and right border
# http://stackoverflow.com/questions/5458409/remove-top-and-right-border-from-ggplot2
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.background=theme_rect(colour=NA))

# 7. returns error when attempting to remove top and right border
# https://groups.google.com/group/ggplot2/browse_thread/thread/f998d113638bf251
#
# Error in el(...) : could not find function "polylineGrob"
#
theme_L_border <- function(colour = "black", size = 1, linetype = 1) { 
   structure( 
     function(x = 0, y = 0, width = 1, height = 1, ...) { 
       polylineGrob( 
         x=c(x+width, x, x), y=c(y,y,y+height), ..., default.units = "npc", 
         gp=gpar(lwd=size, col=colour, lty=linetype), 
       ) 
     }, 
     class = "theme", 
     type = "box", 
     call = match.call() 
   )
}

ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts( panel.border = theme_L_border())
Mark Miller
la source
3
comme publié dans un commentaire ci-dessous, cela peut maintenant être fait avec + theme_classic ()
nsheff

Réponses:

134

MODIFIER Ignorer cette réponse. Il y a maintenant de meilleures réponses. Voir les commentaires. Utilisation+ theme_classic()

ÉDITER

Ceci est une meilleure version. Le bogue mentionné ci-dessous dans le message d'origine demeure (je pense). Mais la ligne d'axe est dessinée sous le panneau. Par conséquent, supprimez à la fois panel.borderet panel.backgroundpour voir les lignes d'axe.

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

ggplot(df, aes(x = a, y = b)) + geom_point() +
  theme_bw() +
  theme(axis.line = element_line(colour = "black"),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    panel.background = element_blank()) 

entrez la description de l'image ici

Message original Cela se rapproche. Il y avait un bug avec axis.linene pas travailler sur l'axe y ( voir ici ), qui ne semble pas encore être corrigé. Par conséquent, après avoir supprimé la bordure du panneau, l'axe des y doit être dessiné séparément en utilisant geom_vline.

library(ggplot2)
library(grid)

a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

p = ggplot(df, aes(x = a, y = b)) + geom_point() +
   scale_y_continuous(expand = c(0,0)) +
   scale_x_continuous(expand = c(0,0)) +
   theme_bw() +
   opts(axis.line = theme_segment(colour = "black"),
        panel.grid.major = theme_blank(),
        panel.grid.minor = theme_blank(),
        panel.border = theme_blank()) +
    geom_vline(xintercept = 0)
p

Les points extrêmes sont découpés, mais le découpage peut être annulé en utilisant le code par baptiste .

gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)

entrez la description de l'image ici

Ou utilisez limitspour déplacer les limites du panneau.

ggplot(df, aes(x = a, y = b)) + geom_point() +
   xlim(0,22) +  ylim(.95, 2.1) +
   scale_x_continuous(expand = c(0,0), limits = c(0,22)) +
   scale_y_continuous(expand = c(0,0), limits = c(.95, 2.2)) +   
   theme_bw() +
   opts(axis.line = theme_segment(colour = "black"),
        panel.grid.major = theme_blank(),
        panel.grid.minor = theme_blank(),
        panel.border = theme_blank()) +
    geom_vline(xintercept = 0)
Sandy Muspratt
la source
Merci pour votre belle explication. Vote positif!
Mohamed Rahouma
76

Les mises à jour récentes de ggplot (0.9.2+) ont remanié la syntaxe des thèmes. Plus particulièrement, opts()est désormais obsolète, ayant été remplacé par theme(). La réponse de Sandy générera toujours (à partir de janvier 12) un graphique, mais amènera R à lancer un tas d'avertissements.

Voici le code mis à jour reflétant la syntaxe actuelle de ggplot:

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

#base ggplot object
p <- ggplot(df, aes(x = a, y = b))

p +
  #plots the points
  geom_point() +

  #theme with white background
  theme_bw() +

  #eliminates background, gridlines, and chart border
  theme(
    plot.background = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank()
  ) +

  #draws x and y axis line
  theme(axis.line = element_line(color = 'black'))

génère:

sortie de tracé

Andrew
la source
33
ou plus simplement? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650
Aucune de ces approches ne fonctionne pour moi en utilisant ggplot2 2.1.0 ... La réponse de @ wkretzsch était bonne.
Nova
25

Une alternative à theme_classic()est le thème fourni avec le package cowplot , theme_cowplot()(chargé automatiquement avec le package). Il ressemble à theme_classic(), avec quelques différences subtiles. Plus important encore, les tailles d'étiquettes par défaut sont plus grandes, de sorte que les chiffres résultants peuvent être utilisés dans les publications sans autre modification nécessaire (en particulier si vous les enregistrez avec save_plot()au lieu de ggsave()). De plus, l'arrière-plan est transparent et non blanc, ce qui peut être utile si vous souhaitez modifier la figure dans Illustrator. Enfin, à mon avis, les graphiques à facettes sont plus beaux.

Exemple:

library(cowplot)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

p <- ggplot(df, aes(x = a, y = b)) + geom_point()
save_plot('plot.png', p) # alternative to ggsave, with default settings that work well with the theme

Voici à quoi ressemble le fichier plot.pngproduit par ce code: entrez la description de l'image ici

Avertissement: je suis l'auteur du package.

Claus Wilke
la source
8

J'ai suivi la réponse d'Andrew , mais j'ai également dû suivre https://stackoverflow.com/a/35833548 et définir les axes x et y séparément en raison d'un bogue dans ma version de ggplot (v2.1.0).

Au lieu de

theme(axis.line = element_line(color = 'black'))

j'ai utilisé

theme(axis.line.x = element_line(color="black", size = 2),
    axis.line.y = element_line(color="black", size = 2))
winni2k
la source
3

Les options ci-dessus ne fonctionnent pas pour les cartes créées avec sfet geom_sf(). Par conséquent, je veux ajouter le ndiscrparamètre pertinent ici. Cela créera une belle carte propre ne montrant que les fonctionnalités.

library(sf)
library(ggplot2)

ggplot() + 
  geom_sf(data = some_shp) + 
  theme_minimal() +                     # white background
  theme(axis.text = element_blank(),    # remove geographic coordinates
        axis.ticks = element_blank()) + # remove ticks
  coord_sf(ndiscr = 0)                  # remove grid in the background
Loki
la source
1

La simplification de la réponse d'Andrew ci-dessus conduit à ce thème clé pour générer la demi-frontière.

theme (panel.border = element_blank(),
       axis.line    = element_line(color='black'))
Sibo Jiang
la source
0

Voici une réponse extrêmement simple

yourPlot +
  theme(
    panel.border = element_blank(), 
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(), 
    axis.line = element_line(colour = "black")
    )

C'est si facile. Source: la fin de cet article

stevec
la source