2

プロットを作成するとします。

df <- data.frame(A = 1:100, B = jitter(1:100, 25), C = c('One', 'Two'))

p <- ggplot(df, aes(A, B, colour = C)) + 
  geom_point() + 
  scale_colour_manual(values = c('red', 'green'))

これらの色 (赤と緑) は のどこに保存されpますか?


ここで、関数で使用されている関数のパレットを確認できます。

p$scales$scales[[1]]$palette

この関数の内容は次のとおりです。

function (n) 
{
  if (n > length(values)) {
    stop("Insufficient values in manual scale. ", n, " needed but only ", 
      length(values), " provided.", call. = FALSE)
  }
  values
}

色はそこに保存する必要があると思いますvaluesが、実際にどこにあるのかわかりませんp


Ps 私はこの質問を見てきました: ggplot オブジェクトから塗りつぶしの色を抽出する方法は? . しかし、私がやろうとしていることについては、プロットを構築できません。組み立てる前に色を揃える必要があります。

p文字「赤」または「緑」を再帰的に検索する方法があれば、おそらくこれらの値を見つけるのに役立ちます。


編集:私が最終的にやろうとしていること。

プロットする前にプロットを編集しようとしています。アイデアは、いくつかのプロットpを指定すると、次のようなことができるということです:

apply_theme(p) 

...そして配色がプロット全体に適用されます (スケール、グラデーションなどを含む)。これは、次のようなことをしなくて済むようにするためです。

p + some_theme + scales_colour_manual(values = plot_theme) 

ユーザーの労力を減らして、テーマをプロット全体に適用できるようにし、グラデーション、個別のスケールなどを着色している​​かどうかを心配する必要がないようにしています。

プロットの構築は部分的な解決策です。しかし、テーマを適用して、後でプロットを編集できるようにしたいと考えています。

pどんな色でもさかのぼってジオメトリに適用されるように編集できました。しかし、スケールカラーでそれを行う方法が見つかりません。色がどこかにあるに違いないことはわかっています!

4

1 に答える 1

3

あまり進んでいませんが、隠れている可能性のあるいくつかの場所を除外しました.

pを含むすべての文字ベクトルを見ることができます

Filter(is.character, unlist(p))
# $labels.x
# [1] "A"

# $labels.y
# [1] "B"

# $labels.colour
# [1] "C"

したがって、直接保存されません。

1 つの色のみを指定してエラーを設定options(error = recover)し、強制することで、コール スタックを調べることができます。

(p <- ggplot(df, aes(A, B, colour = C)) + 
  geom_point() + 
  scale_colour_manual(values = 'red')
)

 1: print(list(data = list(A = 1:100, B = c(4.32692646654323, 3.46481398493052, 0.4989527114667, 
...
13: scale$palette(n)

frame に入ると、変数が実際に色情報を格納し13: scale$palette(n)ていることがわかります。values

Browse[1]> values
[1] "red"

コール スタック内の各フレームを追跡できますが、奇妙なことが起こっています。どこにもないようです。

Browse[1]> sapply(
  sys.frames(), 
  function(envir) 
  {
    exists("values", envir, inherits = FALSE)
  }
)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[16] FALSE FALSE

(sys.status()コール スタックの詳細については、 を参照してください。)

Scales参照クラスで奇妙な評価手法が使用されていると思われます。

于 2013-01-08T15:37:37.717 に答える