8

最小限のケースは次のとおりです。

df <- data.frame(x=1:5, y=1, col=1:5)
mapping <- aes(x=x, y=y)
ggplot(df, mapping) + geom_point(size=10)

mappingここで、既存のオブジェクトに別の美学 (色) を追加 (または上書き) したいと考えています。希望のプロットは

ggplot(df, aes(x=x, y=y, colour=col)) + geom_point(size=10)

これには便利な関数が存在すると確信していますが、ドキュメントには記載されておらず、ソースを閲覧しても役に立ちませんでした。私はかつてのようなものに出くわしたようですがAddOrOverrideAes、正確にどこにあるのかわかりません。

私の現在の解決策は次のとおりです。

add_aes <- function (mapping, ...) {
   new_aes <- structure(append(mapping, as.list(match.call()[-(1:2)])), class = "uneval")
   rename_aes(new_aes)
}

environment(add_aes) <- asNamespace("ggplot2")
ggplot(df, add_aes(mapping, colour=col)) + geom_point(size=10)

追加には問題なく機能しますが、上書きには機能しません (この aes が既に存在するかどうかはチェックされません)。車輪の再発明ですか?

これの動機は GGally のggpairsカスタマイズです。この質問を参照してください。

編集:

ワークフローは次のとおりです。既存のmappingものをパラメーターとして取得し、その場で変更して、さらに別の関数に渡します。「最終」の ggplot 呼び出しを変更できません。

4

1 に答える 1

3

@koshke のコメントに基づいて、これを実行する実際の例を次に示します。

df <- data.frame(x=1:5, y=1, new_y=5:1, col=1:5, new_col=factor(1:5))
mapping <- aes(x=x, y=y, col=col)
ggplot(df, mapping) + geom_point(size=10)

add_modify_aes <- function(mapping, ...) {
  ggplot2:::rename_aes(modifyList(mapping, ...))  
}

ggplot(df, add_modify_aes(mapping, aes(color=new_col, y=new_y))) + geom_point(size=10)

aes 衝突 (つまり、、col)を処理するためのわずかな変更があります。colorcolour

最初のプロット:ここに画像の説明を入力 修正されたプロット:ここに画像の説明を入力

于 2014-02-17T08:30:58.017 に答える