34

ggplot2 で作成されたグリッド オブジェクトからlayer(この場合は の結果)を削除したいと思います。geom_ribbonすでにオブジェクトの一部になっている場合、それを削除する方法はありますか?

library(ggplot2)
dat <- data.frame(x=1:3, y=1:3, ymin=0:2, ymax=2:4)
p <- ggplot(dat, aes(x=x, y=y)) + geom_ribbon(aes(ymin=ymin, ymax=ymax), alpha=0.3) 
     + geom_line()

# This has the geom_ribbon
p

# This overlays another ribbon on top
p + geom_ribbon(aes(ymin=ymin, ymax=ymax, fill=NA))

この機能により、それほど複雑でないプロットの上に、より複雑なプロットを作成できるようにしたいと考えています。グリッド オブジェクトを返す関数を使用し、完全に組み立てられたら最終的なプロットを印刷しています。geom_ribbonベース プロットには、対応するエラー バー ( ) で囲まれた単一の線があります。より複雑なプロットには複数の線があり、複数の重なり合うgeom_ribbonオブジェクトが邪魔になります。複数行のプロットからそれらを削除したいと思います。さらに、ファセットやその他の ggplot2 機能を使用して、代替バージョンをすばやく作成できます。


編集: @mnelの回答をそのまま受け入れます。ここで、レイヤーに動的にアクセスする方法を決定する必要があります。geom_ribbonこれは SO の質問hereでキャプチャされます。


編集2:完全を期すために、これは私がこの問題を解決するために作成した関数です:

remove_geom <- function(ggplot2_object, geom_type) {
  layers <- lapply(ggplot2_object$layers, function(x) if(x$geom$objname == geom_type) NULL else x)
  layers <- layers[!sapply(layers, is.null)]

  ggplot2_object$layers <- layers
  ggplot2_object
}

編集 3: ggplot の最新バージョン (>=2.xy) については、以下の受け入れられた回答を参照してください。

4

5 に答える 5

21

あなたが見れば

p$layers
[[1]]
mapping: ymin = ymin, ymax = ymax 
geom_ribbon: na.rm = FALSE, alpha = 0.3 
stat_identity:  
position_identity: (width = NULL, height = NULL)

[[2]]
geom_line:  
stat_identity:  
position_identity: (width = NULL, height = NULL)

最初のレイヤーを削除したいことがわかります

これを行うには、レイヤーをリストの 2 番目のコンポーネントとして再定義します。

p$layer <- p$layer[2]

ビルドしてプロットするp

p

p$layer[[1]] <- NULL同様に機能することに注意してください。@Andrie と @Joran のコメントに同意しますが、これは有用である可能性があり、必ずしも信頼できるとは考えていません。 ここに画像の説明を入力

于 2012-11-15T22:31:51.873 に答える
2

@カミルと@ペドロどうもありがとう!last_only興味のある方は、ここに引数を付けて示すように、Pedro の関数を拡張して特定のレイヤーのみを選択することもできます。

remove_geoms <- function(x, geom_type, last_only = T) {
  # Find layers that match the requested type.
  selector <- sapply(x$layers,
                     function(y) {
                       class(y$geom)[1] == geom_type
                     })
  if(last_only) 
    selector <- max(which(selector))
  # Delete the layers.
  x$layers[selector] <- NULL
  x
}

@Kamil のサンプル プロットに戻ります。

set.seed(3000)
d <- data.frame(
  x = runif(10),
  y = runif(10),
  label = sprintf("label%s", 1:10)
)

p <- ggplot(d, aes(x, y, label = label)) + geom_point() + geom_point(color = "green") + geom_point(size = 5, color = "red")

p

ここに画像の説明を入力

p %>% remove_geoms("GeomPoint")

ここに画像の説明を入力

p %>% remove_geoms("GeomPoint")  %>% remove_geoms("GeomPoint")

ここに画像の説明を入力

于 2018-07-31T11:17:44.730 に答える