7

グループ化されたバーの中間値、つまり各バーの中心の実際の X 位置を決定する方法を見つけようとしています。これはベース R 関数で簡単に実行できますが、 latticebarplotで実行できるようにしたいと考えています。私の目標は、対応するバーの上にテキスト列の値を表示することです。barchart

以下のコードでは、サブグループを使用しない限り、バーの上にテキストを配置できます。解決策をインターネットで検索してみましたが、何もうまくいかないようです。グラフからわかるように、中点はグループ全体の中心に対してのみ決定されます。

ありがとう!

library(lattice)

test= data.frame(
  group=c("WK 1", "WK 1", "WK 1",  "WK 2", "WK 2", "WK 2", "WK 3", "WK 3", "WK 3"),
  subgroup=c(1,2,3,1,2,3,1,2,3)  ,
  percent=c(60,50,80,55,56,65,77,65,86),
  text=c("n=33", "n=37","n=39","n=25","n=27","n=22","n=13","n=16","n=11")
  )

barchart(data=test, 
         percent~group,
         groups=subgroup,

            panel = function(x,y,...){
              panel.barchart(x, y, ...)
              panel.text( x=unique(test$group), 
                          y=test$percent, 
                          label=unique(test$text) 
                          )

            }
         )

ここに画像の説明を入力

4

1 に答える 1

7

手っ取り早い方法はpanel.barchart、バーが描画される場所の本体を変更して、適切な場所にテキストをプロットすることです。

新しいパネル関数を作成します (私と同じように何度もやり直す必要がある場合に備えて、元の関数がまだそこにあるため、一般的には良い考えです)

myPanelBarchart <- panel.barchart

パネル関数の対応する部分を変更します (注意: グループがなくなった場合、水平にプロットした場合、またはスタックした場合、これは機能しなくなります)。panel.textここで、 ifmyPanelBarchartにという名前の引数が渡されprintVals、それが ではないへの呼び出しを追加しましたFALSE。この引数は、各バーの上に出力する文字ベクトルになります。プロットされるバーの数と同じ長さで、データに対応する順序である必要があります。これが真実であることを確認するために何も追加しませんでした。

body(myPanelBarchart)[[10]][[4]][[2]][[4]][[4]][[9]]<-substitute(for (i in unique(x)) {
    ok <- x == i
    nok <- sum(ok, na.rm = TRUE)
    panel.rect(x = (i + width * (groups[ok] - (nvals + 1)/2)), 
        y = rep(origin, nok), col = col[groups[ok]], border = border[groups[ok]], 
        lty = lty[groups[ok]], lwd = lwd[groups[ok]], width = rep(width, 
            nok), height = y[ok] - origin, just = c("centre", 
            "bottom"), identifier = identifier)
# This is the added part (adjust parameters as you see fit):
    if(!identical(printVals, FALSE)){
      panel.text(x = (i + width * (groups[ok] - (nvals + 1)/2)), y = y[ok],
        label = printVals[ok], adj = c(0.5, -1), identifier = identifier)
    }        

})

新しい関数の仮引数リストを変更して引数を追加しprintVals、デフォルトを指定します。

formals(myPanelBarchart) <- c(formals(panel.barchart), printVals = FALSE)

新しい引数を使用して新しいパネル関数でデータをプロットします

barchart(data=test, 
         percent~group,
         groups=subgroup,

            panel = function(x,y,...){
              myPanelBarchart(x, y, ..., printVals = test$text, )
            }
         )

あなたに与えるべきもの

修正棒グラフ

したがって、長短は、プロットの向きと構成に従って x 位置が決定されるということです。垂直で積み上げられていないグループ化されたバーの場合、x 位置は で決定されbody(myPanelBarchart)[[10]][[4]][[2]][[4]][[4]][[9]]ます。

于 2012-05-07T13:25:44.880 に答える