Xóa lưới, màu nền và đường viền trên cùng và bên phải khỏi ggplot2


103

Tôi muốn tái tạo cốt truyện ngay bên dưới bằng cách sử dụng ggplot2. Tôi có thể đến gần, nhưng không thể xóa các đường viền trên cùng và bên phải. Dưới đây, tôi trình bày một số lần thử sử dụng ggplot2, bao gồm một số đề xuất được tìm thấy trên hoặc qua Stackoverflow. Rất tiếc, tôi đã không thể làm cho những đề xuất đó hoạt động.

Tôi hy vọng ai đó có thể sửa một hoặc nhiều đoạn mã bên dưới.

Cảm ơn bạn đã góp ý

# 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
như đã đăng trong một bình luận bên dưới, điều này hiện có thể được thực hiện với + theme_classic ()
nsheff

Câu trả lời:


133

CHỈNH SỬA Bỏ qua câu trả lời này. Bây giờ có câu trả lời tốt hơn. Xem các bình luận. Sử dụng+ theme_classic()

BIÊN TẬP

Đây là một phiên bản tốt hơn. Lỗi được đề cập bên dưới trong bài đăng gốc vẫn còn (tôi nghĩ). Nhưng đường trục được vẽ dưới bảng điều khiển. Do đó, loại bỏ cả hai panel.borderpanel.backgroundđể xem các đường trục.

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

nhập mô tả hình ảnh ở đây

Bài gốc Điều này đến gần. Có một lỗi axis.linekhông hoạt động trên trục y ( xem tại đây ), có vẻ như chưa được khắc phục. Do đó, sau khi loại bỏ đường viền bảng điều khiển, trục y phải được vẽ riêng bằng cách sử dụng 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

Các điểm cực hạn được cắt bớt, nhưng việc cắt bớt có thể được hoàn tác bằng cách sử dụng mã bởi baptiste .

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

nhập mô tả hình ảnh ở đây

Hoặc sử dụng limitsđể di chuyển ranh giới của bảng điều khiển.

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

Các bản cập nhật gần đây cho ggplot (0.9.2+) đã đại tu cú pháp cho các chủ đề. Đáng chú ý nhất, opts()hiện không được dùng nữa, đã được thay thế bằng theme(). Câu trả lời của Sandy sẽ vẫn (kể từ ngày 12 tháng 1) tạo ra một biểu đồ, nhưng khiến R đưa ra một loạt cảnh báo.

Đây là mã được cập nhật phản ánh cú pháp ggplot hiện tại:

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

tạo ra:

đầu ra âm mưu


33
hay đơn giản hơn? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650

Tôi không sử dụng ggplot2 2.1.0 ... câu trả lời của @ wkretzsch là tốt.
Nova

25

Một lựa chọn thay thế theme_classic()là chủ đề đi kèm với gói cowplot , theme_cowplot()(được tải tự động cùng với gói). Nó trông tương tự theme_classic(), với một vài khác biệt nhỏ. Quan trọng nhất, kích thước nhãn mặc định lớn hơn, vì vậy các số liệu kết quả có thể được sử dụng trong các ấn phẩm mà không cần sửa đổi thêm (đặc biệt nếu bạn lưu chúng save_plot()thay vì ggsave()). Ngoài ra, nền trong suốt, không phải màu trắng, có thể hữu ích nếu bạn muốn chỉnh sửa hình trong illustrator. Cuối cùng, theo ý kiến ​​của tôi, các âm mưu nhiều mặt trông đẹp hơn.

Thí dụ:

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

Đây là tệp plot.pngđược tạo bởi mã này trông giống như sau: nhập mô tả hình ảnh ở đây

Tuyên bố từ chối trách nhiệm: Tôi là tác giả của gói.


8

Tôi đã làm theo câu trả lời của Andrew , nhưng tôi cũng phải làm theo https://stackoverflow.com/a/35833548 và đặt các trục x và y riêng biệt do một lỗi trong phiên bản ggplot (v2.1.0) của tôi.

Thay vì

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

Tôi đã sử dụng

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

3

Các tùy chọn trên không hoạt động đối với các bản đồ được tạo bằng sfgeom_sf(). Do đó, tôi muốn thêm ndiscrthông số có liên quan ở đây. Điều này sẽ tạo ra một bản đồ sạch đẹp chỉ hiển thị các đối tượng địa lý.

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

Đơn giản hóa từ câu trả lời của Andrew ở trên dẫn đến chủ đề chính này để tạo ra một nửa đường viền.

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

0

Đây là một câu trả lời cực kỳ đơn giản

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

Nó là dễ dàng. Nguồn: cuối này bài viết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.