2017-12-28 31 views
0

平均、2 sdエラーバー、1.5 IQRエラーバー、3e 25e、50e、75eおよび97eセンチメイルを含むレイを計算する新しいgeomを作成しました。バイオリンのベースでの観測。統計情報のリストに基づく複合ジオメトのaesの使用に関する問題

# domestic functions 
    #~~~~~~~~~~~~~~~~~~~ 
    IQR.interval.min <- function(vector) 
    { 
    quantile(vector, 0.25) - 1.5 * IQR(vector) ; 
    } ; 

    IQR.interval.max <- function(vector) 
    { 
    quantile(vector, 0.75) + 1.5 * IQR(vector) ; 
    } ; 

    SD.interval.min <- function(vector) 
    { 
    mean(vector) - 2 * sd(vector) ; 
    } ; 

    SD.interval.max <- function(vector) 
    { 
    mean(vector) + 2 * sd(vector) ; 
    } ; 
# My geom 
geom_ray <- function(... , 


        violin.param = list(draw_quantiles = c(0.03, 0.25, 0.5, 0.75, 0.97), 
              scale = "count"), 
         point.param = list(), 
         IQR.param = list(colour = "black", width = 0.2), 
         mean.param = list(shape = 18, size = 4, colour = "darkgrey", 
             position = position_nudge(x = 0.12)), 
         SD.param = list(colour = "darkgrey", width = 0.2, 
             position = position_nudge(x = 0.12)) 
        ) 
{ 
    # graph 
    #~~~~~~ 
    # Parameters 
    param <- list(...) ; 

    violin.param <- modifyList(param, violin.param) ; 

    point.param <- modifyList(param, point.param) ; 

    IQR.param <- modifyList(param, IQR.param) ; 

    mean.param <- modifyList(param, mean.param) ; 

    SD.param <- modifyList(param, SD.param) ; 

    # Stats 
    violin.gg <- do.call("stat_ydensity", 
         modifyList(list(geom = GeomViolin, 
              position = "dodge"), 
            violin.param)) ; 
    point.gg <- do.call("stat_identity", 
         modifyList(list(geom = GeomPoint, 
             position = "identity"), 
            point.param)) ; 

    IQR.gg <- do.call("stat_summary", 
         modifyList(list(fun.ymin = "IQR.interval.min", 
             fun.ymax = "IQR.interval.max", 
             geom = GeomErrorbar, 
             position = "identity"), 
            IQR.param)) ; 

    mean.gg <- do.call("stat_summary", 
        modifyList(list(fun.y = "mean", 
             geom = GeomPoint), 
           mean.param)) ; 

    SD.gg <- do.call("stat_summary", 
        modifyList(list(fun.ymin = "SD.interval.min", 
             fun.ymax = "SD.interval.max", 
             geom = GeomErrorbar), 
           SD.param)) ; 

    # Output 
    #~~~~~~~ 
    return(list(violin.gg, 
       point.gg, 
       IQR.gg, 
       mean.gg, 
       SD.gg 
       ) 
     ) 
} ; 

ジオムの外側にエースを使用するとうまく動作します。私はGEOMの内側にAESを使用する場合

# i.e. 
vector1 <- rnorm(200, 10, 20) ; 
factor1 <- factor(sample(c("homme", "femme"), 200, TRUE, c(0.4,0.6))) ; 
data.frame(factor1 = factor1, vector1 = vector1) -> 
    df1 

require(dplyr) ; require(ggplot2) ; 

df1 %>% 
    ggplot(.) + 
    aes(x = factor1, y = vector1) + 
    geom_ray() 

Raychart

はしかし、それが実行されていない:

df1 %>% 
    ggplot(.) + 
    geom_ray(aes(x = factor1, y = vector1)) 
# Return: 
Erreur : stat_ydensity requires the following missing aesthetics: x, y 

誰かが私がそれをしてください修正する助けてもらえますか? ...はそれであなたのマッピングオブジェクトを持っていますが、それは、引数名のない単なるオブジェクトであり、あなたの失敗例で

おかげ

答えて

0

問題は、あなたのmodifyListの使用です。

test <- list(aes(x, y)) 

modifyListは名前でリストに一致するように設計されています。...は、次のような無名のリストのようなものです。これは、使用しているとき、あなたの引数に名前を付ける必要があるのいずれかを意味し

test2 <- list(a = 1) 
modifyList(test2, test) 
$a 
[1] 1 

testからのマッピングが消えていることに注意してください。) `

:それは名前のない何かを出し投げ関数:

ggplot(df1) + 
    geom_ray(mapping = aes(x = factor1, y = vector1)) 

または、関数のcalに重要な引数名を追加するリットルだけではなく、私のGEOMを埋める...

(あなたがホワイトスペース上に緩和することがあります、そしてラインの末尾に;を使用する必要はありません。)

+0

ありがとうございます。私の最初の問題を解決するには、マッピング= NULLとデータ= NULLを私のルーメンに追加してくださいts。 –

0

を使用しての、私が上でつまずいていますエイズと環境の新しい問題。

内部関数は考慮しないでもない)とみなされ、geom_textで、引数のAES(ラベル= ifelse(is.outlier.all(データ$ y)は、rownames(データ)を、 "" AESされていません。

それはありますreported issueしかし提示の修正(geom_(環境=環境()、...)、または電子<作成 - new.envを())。あなたの助けのための私のコードでは動作しません

geom_mantaray <- function(mapping = NULL, 
          data = NULL, 
          inherit.aes = TRUE, 
          outlier = TRUE, 
          ..., 
          violin.param = list(draw_quantiles = c(0.03, 0.25, 0.5, 0.75, 0.97), 
               scale = "count"), 
          point.param = list(), 
          IQR.param = list(colour = "black", width = 0.2), 
          mean.param = list(shape = 18, size = 4, colour = "darkgrey", 
              position = position_nudge(x = 0.12)), 
          SD1.param = list(colour = "darkgrey", width = 0.1, 
              position = position_nudge(x = 0.12)), 
          SD2.param = list(colour = "darkgrey", width = 0.1, 
              position = position_nudge(x = 0.12)), 
          SD3.param = list(colour = "darkgrey", width = 0.1, 
              position = position_nudge(x = 0.12)), 
          text.param = list(size = 3, 
               position = position_nudge(x = -0.06)) 
) 
{ 
    # Internal functions 
    #~~~~~~~~~~~~~~~~~~~ 
    IQR.interval.min <- function(vector) 
    { 
    quantile(vector, 0.25) - 1.5 * IQR(vector) ; 
    } ; 

    IQR.interval.max <- function(vector) 
    { 
    quantile(vector, 0.75) + 1.5 * IQR(vector) ; 
    } ; 

    SD1.interval.min <- function(vector) 
    { 
    mean(vector) - 1 * sd(vector) ; 
    } ; 

    SD1.interval.max <- function(vector) 
    { 
    mean(vector) + 1 * sd(vector) ; 
    } ; 


    SD2.interval.min <- function(vector) 
    { 
    mean(vector) - 2 * sd(vector) ; 
    } ; 

    SD2.interval.max <- function(vector) 
    { 
    mean(vector) + 2 * sd(vector) ; 
    } ; 


    SD3.interval.min <- function(vector) 
    { 
    mean(vector) - 3 * sd(vector) ; 
    } ; 

    SD3.interval.max <- function(vector) 
    { 
    mean(vector) + 3 * sd(vector) ; 
    } ; 

    is.outlier.all <- function(vector) 
    { 
    # SD outiliers 
    (vector - mean(vector))/sd(vector) -> 
     Z.score ; 

    abs(Z.score) > 3 * sd(vector) -> 
     is.outlierSD.log ; 

    # MAD outiliers 
    (vector - median(vector))/mad(vector) -> 
     Z.scoreMAD ; 

    abs(Z.scoreMAD) > 3 * mad(vector) -> 
     is.outlierMAD.log ; 

    # Tukey's fence outliers 
    quantile(vector, probs = c(0.25, 0.75)) -> quartile.num ; 

    IQR(vector) -> iqr.num ; 

    vector < (quartile.num[1] - (1.5 * iqr.num)) | 
     vector > (quartile.num[2] + (1.5 * iqr.num)) -> 
     is.outlierIQR.log ; 

    # y values 
    is.outlierIQR.log | is.outlierSD.log | is.outlierMAD.log -> is.outlier.log ; 

    return(is.outlier.log) ; 
    } 

    e <- new.env() 
    # graph 
    #~~~~~~ 
    # Parameters 
    param <- list(data = data, 
       mapping = mapping, 
       inherit.aes = inherit.aes, 
       environment = e, 
       ...) ; 

    violin.param <- modifyList(param, violin.param) ; 

    point.param <- modifyList(param, point.param) ; 

    IQR.param <- modifyList(param, IQR.param) ; 

    mean.param <- modifyList(param, mean.param) ; 

    SD1.param <- modifyList(param, SD1.param) ; 

    SD2.param <- modifyList(param, SD2.param) ; 

    SD3.param <- modifyList(param, SD3.param) ; 

    text.param <- modifyList(param, text.param) ; 

    # Stats 
    violin.gg <- do.call("stat_ydensity", 
         modifyList(list(geom = GeomViolin, 
              position = "dodge"), 
            violin.param)) ; 
    point.gg <- do.call("stat_identity", 
         modifyList(list(geom = GeomPoint, 
             position = "identity"), 
            point.param)) ; 

    IQR.gg <- do.call("stat_summary", 
         modifyList(list(fun.ymin = "IQR.interval.min", 
             fun.ymax = "IQR.interval.max", 
             geom = GeomErrorbar, 
             position = "identity"), 
            IQR.param)) ; 

    mean.gg <- do.call("stat_summary", 
         modifyList(list(fun.y = "mean", 
             geom = GeomPoint), 
            mean.param)) ; 

    SD1.gg <- do.call("stat_summary", 
         modifyList(list(fun.ymin = "SD1.interval.min", 
             fun.ymax = "SD1.interval.max", 
             geom = GeomErrorbar), 
            SD2.param)) ; 

    SD2.gg <- do.call("stat_summary", 
         modifyList(list(fun.ymin = "SD2.interval.min", 
             fun.ymax = "SD2.interval.max", 
             geom = GeomErrorbar), 
            SD2.param)) ; 

    SD3.gg <- do.call("stat_summary", 
         modifyList(list(fun.ymin = "SD3.interval.min", 
             fun.ymax = "SD3.interval.max", 
             geom = GeomErrorbar), 
            SD3.param)) ; 

    text.gg <- do.call("stat_identity", 
         modifyList(list( aes(label = ifelse(is.outlier.all(data$y), rownames(data), "")), 
             geom = GeomText), 
            text.param)) ; 

    list(violin.gg, 
     point.gg, 
     IQR.gg, 
     mean.gg, 
     SD1.gg, 
     SD2.gg, 
     SD3.gg) -> 
    output.gg ; 

    if (outlier) 
    { 
    modifyList(output.gg, list(text.gg)) -> 
     output.gg ; 
    } 


    # Output 
    #~~~~~~~ 
    return(output.gg) ; 
} ; 

感謝

関連する問題