Hapus kisi, warna latar belakang, dan batas atas dan kanan dari ggplot2

104

Saya ingin segera mereproduksi plot di bawah ini dengan menggunakan ggplot2. Saya bisa mendekat, tetapi tidak bisa menghapus batas atas dan kanan. Di bawah ini saya menyajikan beberapa upaya menggunakan ggplot2, termasuk beberapa saran yang ditemukan di atau melalui Stackoverflow. Sayangnya saya belum bisa mendapatkan saran tersebut untuk bekerja.

Saya berharap seseorang dapat memperbaiki satu atau lebih potongan kode di bawah ini.

Terima kasih atas sarannya.

# 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
sumber
3
seperti yang diposting di komentar di bawah, ini sekarang dapat dilakukan dengan + theme_classic ()
nsheff

Jawaban:

134

EDIT Abaikan jawaban ini. Sekarang ada jawaban yang lebih baik. Lihat komentarnya. Menggunakan+ theme_classic()

EDIT

Ini adalah versi yang lebih baik. Bug yang disebutkan di bawah ini dalam postingan asli tetap ada (menurut saya). Tetapi garis sumbu digambar di bawah panel. Oleh karena itu, hapus panel.borderdan panel.backgrounduntuk melihat garis sumbu.

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

masukkan deskripsi gambar di sini

Posting asli Ini semakin dekat. Ada bug dengan axis.linetidak bekerja pada sumbu y ( lihat di sini ), yang tampaknya belum diperbaiki. Oleh karena itu, setelah menghilangkan batas panel, sumbu y harus digambar secara terpisah menggunakan 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

Titik ekstrim dipotong, tetapi pemotongan dapat dibatalkan menggunakan kode oleh baptiste .

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

masukkan deskripsi gambar di sini

Atau gunakan limitsuntuk memindahkan batas panel.

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
sumber
Terima kasih atas penjelasan Anda yang bagus. Suara positif!
Mohamed Rahouma
76

Pembaruan terkini untuk ggplot (0.9.2+) telah merombak sintaks untuk tema. Terutama, opts()sekarang sudah usang, telah diganti oleh theme(). Jawaban Sandy akan tetap (per Jan '12) menghasilkan bagan, tetapi menyebabkan R memberikan banyak peringatan.

Berikut kode yang diperbarui yang mencerminkan sintaks ggplot saat ini:

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

menghasilkan:

hasil plot

Andrew
sumber
33
atau lebih sederhana? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650
Tak satu pun dari pendekatan ini yang berhasil untuk saya yang menggunakan ggplot2 2.1.0 ... Jawaban @ wkretzsch bagus.
Nova
25

Alternatifnya theme_classic()adalah tema yang disertakan dengan paket cowplot , theme_cowplot()(dimuat secara otomatis dengan paket). Tampilannya mirip theme_classic(), dengan sedikit perbedaan halus. Yang terpenting, ukuran label default lebih besar, sehingga gambar yang dihasilkan dapat digunakan dalam publikasi tanpa perlu modifikasi lebih lanjut (khususnya jika Anda menyimpannya dengan save_plot()alih - alih ggsave()). Selain itu, latar belakangnya transparan, bukan putih, yang mungkin berguna jika Anda ingin mengedit gambar di ilustrator. Akhirnya, plot segi terlihat lebih baik, menurut saya.

Contoh:

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

Seperti inilah file yang plot.pngdihasilkan oleh kode ini: masukkan deskripsi gambar di sini

Penafian: Saya adalah pembuat paket.

Claus Wilke
sumber
8

Saya mengikuti jawaban Andrew , tetapi saya juga harus mengikuti https://stackoverflow.com/a/35833548 dan mengatur sumbu x dan y secara terpisah karena ada bug dalam versi ggplot saya (v2.1.0).

Dari pada

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

Saya dulu

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

Opsi di atas tidak berfungsi untuk peta yang dibuat dengan sfdan geom_sf(). Karenanya, saya ingin menambahkan ndiscrparameter yang relevan di sini. Ini akan membuat peta bersih yang bagus hanya menampilkan fitur-fiturnya.

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
sumber
1

Penyederhanaan dari jawaban Andrew di atas mengarah pada tema kunci ini untuk menghasilkan batas setengah.

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

Inilah jawaban yang sangat sederhana

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

Semudah itu. Sumber: akhir artikel ini

stevec
sumber