Usuń siatkę, kolor tła oraz górną i prawą krawędź z ggplot2

104

Chciałbym odtworzyć fabułę bezpośrednio poniżej, używając ggplot2. Mogę podejść blisko, ale nie mogę usunąć górnej i prawej krawędzi. Poniżej przedstawiam kilka prób użycia ggplot2, w tym kilka sugestii znalezionych na lub za pośrednictwem Stackoverflow. Niestety nie udało mi się zmusić tych sugestii do działania.

Mam nadzieję, że ktoś może poprawić jeden lub więcej poniższych fragmentów kodu.

Dziękuję za wszelkie sugestie.

# 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
źródło
3
jak napisano w komentarzu poniżej, można to teraz zrobić za pomocą + theme_classic ()
nsheff

Odpowiedzi:

134

EDYCJA Zignoruj ​​tę odpowiedź. Są teraz lepsze odpowiedzi. Zobacz komentarze. Posługiwać się+ theme_classic()

EDYTOWAĆ

To jest lepsza wersja. Błąd wspomniany poniżej w oryginalnym poście pozostaje (tak mi się wydaje). Ale linia osi jest rysowana pod panelem. Dlatego usuń oba panel.borderi, panel.backgroundaby zobaczyć linie osi.

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

wprowadź opis obrazu tutaj

Oryginalny post To się zbliża. Wystąpił błąd z axis.lineniedziałającą osią Y ( patrz tutaj ), który wydaje się nie zostać jeszcze naprawiony. Dlatego po usunięciu obrzeża panelu oś Y należy narysować osobno za pomocą 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

Skrajne punkty są obcinane, ale przycinanie można cofnąć za pomocą kodu utworzonego przez baptiste .

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

wprowadź opis obrazu tutaj

Lub użyj, limitsaby przesunąć granice panelu.

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
źródło
76

Ostatnie aktualizacje ggplot (0.9.2+) zmieniły składnię motywów. Przede wszystkim opts()jest teraz przestarzały i został zastąpiony przez theme(). Odpowiedź Sandy'ego nadal (od stycznia '12) generuje wykres, ale powoduje, że R rzuca kilka ostrzeżeń.

Oto zaktualizowany kod odzwierciedlający aktualną składnię 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'))

generuje:

wyjście wydruku

Andrzej
źródło
33
czy prościej? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650
Żadne z tych podejść nie działa dla mnie przy użyciu ggplot2 2.1.0 ... Odpowiedź @ wkretzsch była dobra.
Nova
25

Alternatywą theme_classic()jest motyw dostarczany z pakietem cowplottheme_cowplot() (ładowany automatycznie wraz z pakietem). Wygląda podobnie theme_classic(), z kilkoma subtelnymi różnicami. Co najważniejsze, domyślne rozmiary etykiet są większe, więc otrzymane liczby można wykorzystać w publikacjach bez konieczności dalszych modyfikacji (w szczególności, jeśli zapisujesz je z save_plot()zamiast ggsave()). Ponadto tło jest przezroczyste, a nie białe, co może być przydatne, jeśli chcesz edytować figurę w programie Illustrator. W końcu, moim zdaniem, działki fasetowe wyglądają lepiej.

Przykład:

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

Tak wygląda plik plot.pngutworzony przez ten kod: wprowadź opis obrazu tutaj

Zastrzeżenie: jestem autorem pakietu.

Claus Wilke
źródło
8

Poszedłem za odpowiedź Andrzeja , ale miałem również śledzić https://stackoverflow.com/a/35833548 i ustawienie osi X i Y oddzielnie ze względu na błąd w mojej wersji ggplot (v2.1.0).

Zamiast

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

użyłem

theme(axis.line.x = element_line(color="black", size = 2),
    axis.line.y = element_line(color="black", size = 2))
winni2k
źródło
3

Powyższe opcje nie działają w przypadku map utworzonych za pomocą sfi geom_sf(). Dlatego chcę tutaj dodać odpowiedni ndiscrparametr. Stworzy to ładną, czystą mapę pokazującą tylko funkcje.

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
źródło
1

Uproszczenie z powyższej odpowiedzi Andrzeja prowadzi do tego kluczowego tematu do wygenerowania półkrawędzi.

theme (panel.border = element_blank(),
       axis.line    = element_line(color='black'))
Sibo Jiang
źródło
0

Oto niezwykle prosta odpowiedź

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

To jest takie proste. Źródło: koniec tego artykułu

stevec
źródło