ลบเส้นตารางสีพื้นหลังและเส้นขอบด้านบนและด้านขวาออกจาก ggplot2


104

ฉันต้องการทำซ้ำพล็อตด้านล่างทันทีโดยใช้ ggplot2 ฉันสามารถเข้ามาใกล้ได้ แต่ไม่สามารถลบเส้นขอบด้านบนและด้านขวาได้ ด้านล่างนี้ฉันนำเสนอความพยายามหลายครั้งโดยใช้ ggplot2 รวมถึงคำแนะนำหลายอย่างที่พบในหรือผ่าน Stackoverflow น่าเสียดายที่ฉันไม่สามารถรับคำแนะนำเหล่านั้นในการทำงานได้

ฉันหวังว่าอาจมีคนแก้ไขข้อมูลโค้ดด้านล่างได้อย่างน้อยหนึ่งรายการ

ขอบคุณสำหรับคำแนะนำใด ๆ

# 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
ตามที่โพสต์ไว้ในความคิดเห็นด้านล่างตอนนี้สามารถทำได้ด้วย + theme_classic ()
nsheff

คำตอบ:


134

แก้ไข ไม่สนใจคำตอบนี้ ตอนนี้มีคำตอบที่ดีกว่า ดูความคิดเห็น ใช้+ theme_classic()

แก้ไข

นี่เป็นเวอร์ชันที่ดีกว่า ข้อบกพร่องที่กล่าวถึงด้านล่างในโพสต์ต้นฉบับยังคงอยู่ (ฉันคิดว่า) แต่เส้นแกนถูกวาดไว้ใต้แผงควบคุม ดังนั้นให้ลบทั้งสองpanel.borderและpanel.backgroundเพื่อดูเส้นแกน

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

ป้อนคำอธิบายภาพที่นี่

โพสต์ต้นฉบับ สิ่งนี้ใกล้เข้ามาแล้ว มีข้อบกพร่องที่axis.lineไม่ทำงานบนแกน y ( ดูที่นี่ ) ซึ่งดูเหมือนจะยังไม่ได้รับการแก้ไข ดังนั้นหลังจากที่ถอดชายแดนแผงแกน y 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

จุดที่รุนแรงจะตัด แต่ตัดสามารถยกเลิกได้โดยใช้รหัสติส

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

ป้อนคำอธิบายภาพที่นี่

หรือใช้limitsเพื่อย้ายขอบเขตของแผง.

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

การอัปเดตล่าสุดของ ggplot (0.9.2+) ได้ปรับปรุงไวยากรณ์สำหรับธีม ที่สะดุดตาที่สุดคือตอนนี้เลิกได้ถูกแทนที่ด้วย opts() คำตอบของแซนดี้จะยังคงสร้างแผนภูมิ (ณ ม.ค. 55) แต่ทำให้ R โยนคำเตือนออกมามากมาย theme()

นี่คือรหัสที่อัปเดตซึ่งสะท้อนถึงไวยากรณ์ของ 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'))

สร้าง:

พล็อตเอาต์พุต


33
หรือมากกว่านั้นง่ายๆ? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650

วิธีการเหล่านี้ไม่ได้ผลสำหรับฉันโดยใช้ ggplot2 2.1.0 ... คำตอบของ @wkretzsch นั้นดี
Nova

25

อีกทางเลือกหนึ่งtheme_classic()คือธีมที่มาพร้อมกับแพ็คเกจcowplottheme_cowplot() (โหลดโดยอัตโนมัติด้วยแพ็คเกจ) ดูเหมือนtheme_classic()ว่ามีความแตกต่างเล็กน้อย สิ่งสำคัญที่สุดคือขนาดฉลากเริ่มต้นจะใหญ่กว่าดังนั้นตัวเลขที่ได้จึงสามารถใช้ในสิ่งพิมพ์ได้โดยไม่จำเป็นต้องแก้ไขเพิ่มเติม (โดยเฉพาะอย่างยิ่งหากคุณบันทึกด้วยsave_plot()แทนggsave()) นอกจากนี้พื้นหลังยังโปร่งใสไม่ใช่สีขาวซึ่งอาจเป็นประโยชน์หากคุณต้องการแก้ไขภาพในนักวาดภาพประกอบ ในที่สุดพล็อตเหลี่ยมเพชรพลอยก็ดูดีขึ้นในความคิดของฉัน

ตัวอย่าง:

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

นี่คือลักษณะของไฟล์ที่plot.pngสร้างโดยรหัสนี้: ป้อนคำอธิบายภาพที่นี่

คำเตือน: ฉันเป็นผู้เขียนแพ็คเกจ


8

ฉันทำตามคำตอบของ Andrewแต่ฉันต้องติดตามhttps://stackoverflow.com/a/35833548และตั้งค่าแกน x และ y แยกกันเนื่องจากข้อบกพร่องใน ggplot เวอร์ชันของฉัน (v2.1.0)

แทน

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

ฉันใช้

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

3

ตัวเลือกข้างต้นไม่ทำงานสำหรับแผนที่ที่สร้างขึ้นด้วยและsf geom_sf()ดังนั้นฉันต้องการเพิ่มndiscrพารามิเตอร์ที่เกี่ยวข้องที่นี่ สิ่งนี้จะสร้างแผนที่ที่สวยงามซึ่งแสดงเฉพาะคุณสมบัติ

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

การทำให้เรียบง่ายจากคำตอบของ Andrew ข้างต้นนำไปสู่ธีมหลักนี้เพื่อสร้างเส้นขอบครึ่งหนึ่ง

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

0

นี่คือคำตอบที่ง่ายมาก

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

มันง่ายมาก ที่มา: จุดสิ้นสุดของการนี้บทความ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.