source

ggplot2에서 그리드, 배경색 및 상단 및 오른쪽 테두리 제거

ittop 2023. 7. 16. 17:55
반응형

ggplot2에서 그리드, 배경색 및 상단 및 오른쪽 테두리 제거

저는 ggplot2를 사용하여 바로 아래 플롯을 재현하고 싶습니다.가까이 갈 수는 있지만 위쪽과 오른쪽 테두리는 제거할 수 없습니다.아래에서는 스택 오버플로에서 또는 스택 오버플로를 통해 발견된 여러 제안을 포함하여 ggplot2를 사용하는 몇 가지 시도를 제시합니다.유감스럽게도 저는 그 제안들을 실행에 옮길 수 없었습니다.

누군가 아래 코드 스니펫 중 하나 이상을 수정할 수 있기를 바랍니다.

제안해 주셔서 감사합니다.

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

편집 이 대답을 무시합니다.이제 더 나은 답이 있습니다.댓글 보세요.사용하다+ theme_classic()

편집

이것이 더 좋은 버전입니다.원래 게시물에 아래 언급된 버그가 남아 있는 것 같습니다(제 생각).그러나 축선은 패널 아래에 그려집니다.따라서 두 개의 밸브를 모두 탈거하십시오.panel.border그리고.panel.background축 선을 확인합니다.

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- data.frame(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()) 

enter image description here

원래 게시물 이것이 가까워집니다.에 버그가 있었습니다.axis.liney축에서 작동하지 않음(여기 참조), 아직 고정되지 않은 것으로 나타납니다.따라서 패널 테두리를 제거한 후에는 다음을 사용하여 Y축을 별도로 그려야 합니다.geom_vline.

library(ggplot2)
library(grid)

a <- seq(1,20)
b <- a^0.25
df <- data.frame(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)

enter image description here

또는 사용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)

ggplot(0.9.2+)에 대한 최근 업데이트로 테마에 대한 구문이 개선되었습니다.가장 주목할 만한 것은,opts()로 대체되어 이제는 더 이상 사용되지 않습니다.theme()Sandy의 답변은 여전히 (2012년 1월 기준) 차트를 생성하지만 R이 경고를 많이 던지게 합니다.

다음은 현재 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'))

생성:

plot output

의 대안theme_classic()그림 패키지와 함께 제공되는 주제입니다.theme_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이 코드로 생성된 것은 다음과 같습니다.enter image description here

고지 사항:저는 패키지 작성자입니다.

저는 Andrew의 답변을 따랐지만, 제 버전의 ggplot(v2.1.0)의 버그로 인해 https://stackoverflow.com/a/35833548 을 따라 x축과 y축을 따로 설정해야 했습니다.

대신에

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

은 위의옵다사용작성맵않으로 작성된 .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

여기 아주 간단한 대답이 있습니다.

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

그 정도로 쉽습니다.출처: 이 기사의 끝

위의 Andrew의 답변에서 단순화하면 절반의 경계를 생성하는 핵심 주제가 됩니다.

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

또한 확인할 수 있습니다.panel.background뿐만 아니라.

 theme(
        panel.background = element_rect(fill = "black"),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank()

언급URL : https://stackoverflow.com/questions/10861773/remove-grid-background-color-and-top-and-right-borders-from-ggplot2

반응형