Ggplot2'den ızgara, arka plan rengi ve üst ve sağ kenarlıkları kaldırın


104

Hemen aşağıdaki grafiği ggplot2 kullanarak yeniden oluşturmak istiyorum. Yaklaşabilirim ama üst ve sağ sınırları kaldıramıyorum. Aşağıda, Stackoverflow üzerinde veya aracılığıyla bulunan birkaç öneri de dahil olmak üzere ggplot2 kullanarak birkaç deneme sunuyorum. Maalesef bu önerileri işe alamadım.

Birinin aşağıdaki kod parçacıklarından birini veya birkaçını düzeltebileceğini umuyorum.

Önerileriniz için teşekkürler.

# 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
aşağıdaki yorumda yayınlandığı gibi, bu artık + theme_classic () ile yapılabilir
nsheff

Yanıtlar:


134

DÜZENLE Bu yanıtı göz ardı edin. Artık daha iyi cevaplar var. Yorumlara bakın. Kullanım+ theme_classic()

DÜZENLE

Bu daha iyi bir versiyon. Orijinal gönderide aşağıda belirtilen hata kalır (sanırım). Ancak eksen çizgisi panelin altına çizilir. Bu nedenle her iki kaldırma panel.borderve panel.backgroundeksen çizgilerini görmek için.

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

görüntü açıklamasını buraya girin

Orijinal gönderi Bu yaklaşıyor. Henüz düzeltilmemiş gibi görünen axis.liney ekseninde çalışmayan ( buraya bakın ) bir hata vardı . Bu nedenle, panel kenarlığı kaldırıldıktan sonra, y ekseni ayrı ayrı kullanılarak çizilmelidir 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

Uç noktalar kırpılır, ancak kırpma, baptiste tarafından kod kullanılarak geri alınabilir .

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

görüntü açıklamasını buraya girin

Veya limitspanelin sınırlarını taşımak için kullanı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

Ggplot (0.9.2+) için yapılan son güncellemeler, temaların sözdizimini elden geçirdi. En önemlisi, opts()artık kullanımdan kaldırılmıştır, yerine geçmiştir theme(). Sandy'nin cevabı yine de (Ocak '12 itibariyle) bir grafik oluşturacak, ancak R'nin bir dizi uyarı atmasına neden olacak.

Mevcut ggplot sözdizimini yansıtan güncellenmiş kodu burada bulabilirsiniz:

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

üretir:

arsa çıktısı


33
veya daha basitçe? ggplot (df, aes (x = a, y = b)) + geom_point () + theme_classic ()
user20650

Bu yaklaşımların hiçbiri ggplot2 2.1.0 ... @ wkretzsch kullanarak benim için işe yaramıyor.
Nova

25

Bunun bir alternatifi theme_classic(), cowplot paketiyle birlikte gelen temadır ( paketle theme_cowplot()birlikte otomatik olarak yüklenir). theme_classic()Birkaç ince farklılıkla benzer görünüyor . En önemlisi, varsayılan etiket boyutları daha büyüktür, bu nedenle elde edilen rakamlar başka değişikliklere gerek kalmadan yayınlarda kullanılabilir (özellikle save_plot()bunun yerine bunları kaydederseniz ggsave()). Ayrıca, arka plan şeffaftır, beyaz değildir; bu, şekli illustrator uygulamasında düzenlemek istiyorsanız kullanışlı olabilir. Son olarak, bence, yönlü grafikler daha iyi görünüyor.

Misal:

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

Dosya bu plot.png kod tarafından üretilen şuna benzer: görüntü açıklamasını buraya girin

Sorumluluk reddi: Ben paket yazarıyım.


8

Andrew'un cevabını takip ettim , ancak ggplot sürümümdeki (v2.1.0) bir hata nedeniyle https://stackoverflow.com/a/35833548'i takip etmek ve x ve y eksenlerini ayrı ayrı ayarlamak zorunda kaldım .

Onun yerine

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

kullandım

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

3

Yukarıdaki seçenekler, sfve ile oluşturulan haritalarda çalışmaz geom_sf(). Bu nedenle, ilgili ndiscrparametreyi buraya eklemek istiyorum. Bu, yalnızca özellikleri gösteren güzel ve temiz bir harita oluşturacaktır.

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

Yukarıdaki Andrew'un cevabının basitleştirilmesi, bu ana temanın yarım sınırı oluşturmasına yol açar.

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

0

İşte son derece basit bir cevap

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

İşte bu kadar kolay. Kaynak: bu makalenin sonu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.