Verwijder raster, achtergrondkleur en boven- en rechterranden van ggplot2

Ik wil de plot direct hieronder reproduceren door ggplot2 te gebruiken. Ik kan dichtbij komen, maar kan de boven- en rechterranden niet verwijderen. Hieronder presenteer ik verschillende pogingen met behulp van ggplot2, inclusief verschillende suggesties die op of via Stackoverflow zijn gevonden. Helaas heb ik die suggesties niet kunnen laten werken.

Ik hoop dat iemand een of meer van de onderstaande codefragmenten kan corrigeren.

Bedankt voor eventuele suggesties.

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

Antwoord 1, autoriteit 100%

BEWERKENNegeer dit antwoord. Er zijn nu betere antwoorden. Zie de opmerkingen. Gebruik + theme_classic()

BEWERKEN

Dit is een betere versie. De bug die hieronder in het oorspronkelijke bericht wordt genoemd, blijft (denk ik). Maar de aslijn wordt onder het paneel getekend. Verwijder daarom zowel de panel.borderals panel.backgroundom de aslijnen te zien.

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

voer hier de afbeeldingsbeschrijving in

Originele post
Dit komt in de buurt. Er is een fout opgetreden waarbij axis.lineniet werkte op de y-as (zie hier), dat lijkt nog niet te zijn opgelost. Daarom moet na het verwijderen van de paneelrand de y-as apart worden ingetekend met 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

De extreme punten worden afgekapt, maar het uitknippen kan ongedaan worden gemaakt met behulp van code door baptiste.

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

voer hier de afbeeldingsbeschrijving in

Of gebruik limitsom de grenzen van het paneel te verplaatsen.

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)

Antwoord 2, autoriteit 51%

Recente updates voor ggplot (0.9.2+) hebben de syntaxis voor thema’s herzien. Het meest opvallende is dat opts()nu is verouderd en is vervangen door theme(). Sandy’s-antwoord genereert nog steeds (vanaf januari ’12) een grafiek, maar zorgt ervoor dat R een aantal waarschuwingen geeft .

Hier is de bijgewerkte code die de huidige ggplot-syntaxis weerspiegelt:

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

genereert:

plotuitvoer


Antwoord 3, autoriteit 17%

Een alternatief voor theme_classic()is het thema dat wordt geleverd met het cowplotpakket, theme_cowplot()(automatisch geladen met het pakket). Het lijkt op theme_classic(), met een paar subtiele verschillen. Het belangrijkste is dat de standaard labelgroottes groter zijn, zodat de resulterende cijfers kunnen worden gebruikt in publicaties zonder dat verdere aanpassingen nodig zijn (in het bijzonder als u ze opslaat met save_plot()in plaats van ggsave()). Ook is de achtergrond transparant, niet wit, wat handig kan zijn als je de figuur in illustrator wilt bewerken. Ten slotte zien gefacetteerde plots er naar mijn mening beter uit.

Voorbeeld:

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

Zo ziet het bestand plot.pnggeproduceerd door deze code eruit:
voer hier de afbeeldingsbeschrijving in

Disclaimer: ik ben de auteur van het pakket.


Antwoord 4, autoriteit 5%

Ik volgde Andrew’s antwoord, maar ik moest ook https://stackoverflow.com/a/35833548en stel de x- en y-assen afzonderlijk in vanwege een bug in mijn versie van ggplot (v2.1.0).

In plaats van

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

Ik gebruikte

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

Antwoord 5, autoriteit 2%

De bovenstaande opties werken niet voor kaarten die zijn gemaakt met sfen geom_sf(). Daarom wil ik hier de relevante parameter ndiscrtoevoegen. Dit zorgt voor een mooie, schone kaart met alleen de functies.

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

Antwoord 6

Vereenvoudiging van het bovenstaande antwoord van Andrew leidt tot dit hoofdthema om de halve rand te genereren.

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

Antwoord 7

Hier is een uiterst eenvoudig antwoord

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

Zo eenvoudig is het. Bron: het einde van ditartikel

Other episodes