web-dev-qa-db-ja.com

塗りつぶされたポイントシンボルと凡例を含むプロット関数

2つの関数を異なる色とポイントスタイルで対応する凡例プレーンRでプロットします。

いくつか質問があります。

  1. _pch=21_と_pch=22_を使用しています。私の理解では、それらは「塗りつぶされた」シンボルです。凡例では期待どおりに塗りつぶされているように見えますが、グラフ自体では中空に見えます。どうしましたか?

  2. グリッドを手動で指定せずに、ポイント間のスペースを増やすことはできますか?多分印刷するポイントの数を選択することによって?

  3. 必要なアドバイスを自由に追加してください。私はRが初めてです。特に、2つの関数をプロットするより良い方法はありますか?例えば関数のベクトルを定義することによって?そして、プレーンRで色と形を指定せずに、凡例を自動生成する方法はないでしょうか?

私のコードは次のとおりです。

_par(new=TRUE)
p1 <- plot(function(x){ x^(2)/2 }
       , 0, 100
       , xlab = "x"
       , ylab = "y"
       , ylim = c(0,5000)
       , las = 1
       , type = "p"
       , cex = 0.8
       , pch = 21
       , col = "red"
)
par(new=TRUE)
p2 <- plot(function(x){ (1-x^(2))/2 }
       , 0, 100
       , xlab = ""
       , ylab = ""
       , axes = FALSE
       , type = "p"
       , cex = 0.8
       , pch = 22
       , col = "blue"
)
par(new=TRUE)
l <- legend( "topleft"
         , inset = c(0,0.4) 
         , cex = 1.5
         , bty = "n"
         , legend = c("A", "B")
         , text.col = c("red", "blue")
         , pt.bg = c("red","blue")
         , pch = c(21,22)
)
_

さまざまな調査の後、par(new=TRUE) "トリック"を使用して2つの関数を重ね合わせることを選択しました(たとえば、matplotまたはプロットとポイントまたはレイアウトの組み合わせを使用するのではなく)。それはそもそも悪い動きでしたか? (編集:はい、非常に悪い、以下を参照)マニュアルを読むように頼まない場合は+1 ;-)

enter image description here

編集:ソリューションの概要

JoranとDidzis Elfertsのおかげで、いくつかの問題を解決できました。記録のために、私はここに要約したいと思います:

  1. グラフで塗りつぶされたシンボルを取得するには、col(色)とbg(背景)の両方を指定する必要があります。これは、指定された色で自動的に塗りつぶされない_pch=21_および_pch=22_にも当てはまります。凡例で塗りつぶされたシンボルを取得するには、colとpt.bgの両方を指定する必要があります。ここでは、bgだけでは十分ではありません。

  2. オーバーレイプロットは必ずしも同じ座標系を使用するとは限らないため、par(new=TRUE)を_axes=FALSE_とともに使用することは非常に悪い考えです。 2番目のプロットの目的の関数は_(100^2-x^2)/2_でしたが、誤って_(1-x^2)/2_を記述しましたが、axes = FALSEに設定したため、それを認識しませんでした。

全体として、ここに私の好ましい解決策があります:

_curve( x^2/2
  , from = 0
  , to = 100
  , n = 30
  , type = "p"
  , pch = 21 # alternatively pch=15 is a solid symbol
  , col = "red" # colors the outline of hollow symbol pch=21
  , bg = "red" # fills hollow symbol pch=21 with color
  , xlab = "x"
  , ylab = "y"
)
curve( (100^2-x^2)/2
  , from = 0
  , to = 100
  , n = 30
  , type = "p"
  , pch = 22  # alternative pch=16
  , col = "blue"
  , bg = "blue"
  , add = TRUE
)
legend( "topleft"
  , inset = c(0,0.4), 
  , cex = 1.5, 
  , bty = "n", 
  , legend = c("A", "B"), 
  , text.col = c("red", "blue"),
  , col = c("red", "blue"), 
  , pt.bg = c("red","blue")
  , pch = c(21,22)
)
_

これにより、joranが示すようなプロットが生成されます。助けてくれてありがとう。

27
PatrickT

多分あなたはcurveを使用してより良い運を持っていると思います:

curve(x^(2) / 2,from = 0,to = 100,col = 'red',type = 'p',pch = 16,n = 20)
curve((1-x^(2))/2 + 5000,from = 0,to = 100,col = 'blue',type = 'p',pch = 15,add = TRUE,n = 20)
legend("topleft", 
        inset = c(0,0.4), 
        cex = 1.5, 
        bty = "n", 
        legend = c("A", "B"), 
        text.col = c("red", "blue"),
        col = c("red", "blue"), 
        pch = c(16,15))

enter image description here

画像に合った出力を得るために、関数を微調整する必要があったことに注意してください。

色と塗りつぶしを別々に指定することを避けるために(これは一般にRで行われる方法です)、私はいくつかの古い「レガシー」シンボルを使用しました。 curveの使用は、多くの場合、関数または式をプロットするためにはるかに簡単です。また、評価するポイントのグリッドを指定するより便利な方法を提供します。また、add引数もあり、これを使用すると、厄介なparハッキングをスキップできます。

8
joran

plot()内に引数_bg="red"_または_bg="blue"_を追加して、特定の色で塗りつぶされたシンボルを取得する必要があります。

7
Didzis Elferts