ggplot2からグリッド、背景色、上と右の境界を削除


103

すぐ下のプロットをggplot2を使って再現したいと思います。近づくことはできますが、上と右の境界を削除できません。以下に、Stackoverflow上またはStackoverflow経由で見つかったいくつかの提案を含む、ggplot2を使用したいくつかの試みを示します。残念ながら、私はそれらの提案を機能させることができませんでした。

誰かが以下のコードスニペットの1つ以上を修正できる可能性があることを願っています。

ご提案ありがとうございます。

# 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

回答:


133

編集 この回答は無視してください。より良い答えがあります。コメントを参照してください。使用する+ 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.liney軸(ここを参照)が機能しないバグがあり、まだ修正されていないようです。したがって、パネルの境界を削除した後、を使用して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()は廃止され、に置き換えられましたtheme()サンディーズ答えは(Jan '12現在)まだグラフを生成しますが、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'))

生成する:

プロット出力


33
より単純に?ggplot(df、aes(x = a、y = b))+ geom_point()+ theme_classic()
user20650

これらのアプローチはいずれも、ggplot2 2.1.0を使用して私には機能しません... @wkretzschの答えは良かったです。
ノヴァ

24

の代わりにtheme_classic()カウプロットパッケージに付属のテーマがありますtheme_cowplot()(パッケージとともに自動的にロードされます)。に似ていますtheme_classic()が、わずかな違いがあります。最も重要なのは、デフォルトのラベルサイズが大きいため、結果の図をさらに変更することなく(特にのsave_plot()代わりにで保存した場合)、文書で使用できることですggsave()。また、背景は白ではなく透明なので、illustratorで図を編集したい場合に便利です。最後に、多面的なプロットは、私の意見ではより良く見えます。

例:

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

私は、その後アンドリューの答えを、私も従っていたhttps://stackoverflow.com/a/35833548起因ggplot(バージョン2.1.0)の私のバージョンのバグに別々の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))

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.