Rimuovi griglia, colore di sfondo e bordi in alto e a destra da ggplot2


103

Vorrei riprodurre la trama immediatamente sotto usando ggplot2. Posso avvicinarmi, ma non posso rimuovere i bordi superiore e destro. Di seguito presento diversi tentativi utilizzando ggplot2, inclusi diversi suggerimenti trovati su o tramite Stackoverflow. Purtroppo non sono riuscito a far funzionare quei suggerimenti.

Spero che qualcuno possa essere in grado di correggere uno o più frammenti di codice di seguito.

Grazie per eventuali suggerimenti.

# 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())

3
come pubblicato in un commento qui sotto, questo può ora essere fatto con + theme_classic ()
nsheff

Risposte:


133

EDIT Ignora questa risposta. Ora ci sono risposte migliori. Vedi i commenti. Uso+ theme_classic()

MODIFICARE

Questa è una versione migliore. Il bug menzionato di seguito nel post originale rimane (credo). Ma la linea dell'asse è disegnata sotto il pannello. Pertanto, rimuovere sia il panel.borderche panel.backgroundper visualizzare le linee degli assi.

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()) 

inserisci qui la descrizione dell'immagine

Post originale Questo si avvicina. C'era un bug che axis.linenon funzionava sull'asse y ( vedi qui ), che sembra non essere stato ancora risolto. Pertanto, dopo aver rimosso il bordo del pannello, l'asse y deve essere disegnato separatamente usando 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

I punti estremi vengono tagliati, ma il ritaglio può essere annullato utilizzando il codice di baptiste .

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

inserisci qui la descrizione dell'immagine

Oppure usa limitsper spostare i confini del pannello.

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)

76

I recenti aggiornamenti a ggplot (0.9.2+) hanno revisionato la sintassi dei temi. In particolare, opts()ora è deprecato, essendo stato sostituito da theme(). La risposta di Sandy genererà ancora (a partire da gennaio '12) un grafico, ma fa sì che R lanci una serie di avvisi.

Ecco il codice aggiornato che riflette la sintassi corrente di 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'))

genera:

output della trama


33
o più semplicemente? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650

Nessuno di questi approcci funziona per me usando ggplot2 2.1.0 ... La risposta di @ wkretzsch è stata buona.
Nova

25

Un'alternativa theme_classic()è il tema che viene fornito con il pacchetto cowplot , theme_cowplot()(caricato automaticamente con il pacchetto). Sembra simile a theme_classic(), con alcune sottili differenze. Ancora più importante, le dimensioni delle etichette predefinite sono maggiori, quindi le cifre risultanti possono essere utilizzate nelle pubblicazioni senza ulteriori modifiche necessarie (in particolare se le salvi con save_plot()invece di ggsave()). Inoltre, lo sfondo è trasparente, non bianco, il che può essere utile se si desidera modificare la figura in Illustrator. Infine, secondo me, le trame sfaccettate hanno un aspetto migliore.

Esempio:

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

Questo è l' plot.pngaspetto del file prodotto da questo codice: inserisci qui la descrizione dell'immagine

Disclaimer: sono l'autore del pacchetto.


8

Ho seguito la risposta di Andrew , ma ho anche dovuto seguire https://stackoverflow.com/a/35833548 e impostare gli assi xey separatamente a causa di un bug nella mia versione di ggplot (v2.1.0).

Invece di

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

ero solito

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

3

Le opzioni precedenti non funzionano per le mappe create con sfe geom_sf(). Quindi, voglio aggiungere il ndiscrparametro pertinente qui. Questo creerà una bella mappa pulita che mostra solo le caratteristiche.

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

1

La semplificazione di quanto sopra La risposta di Andrew porta a questo tema chiave per generare il mezzo bordo.

theme (panel.border = element_blank(),
       axis.line    = element_line(color='black'))

0

Ecco una risposta estremamente semplice

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

È così facile. Fonte: la fine di questo articolo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.