2017-02-11 2 views
1

ggplotを関数内で使用しようとしていますが、プロットを 作成できません。具体的には、プロット が関数呼び出しのfacet_grid()を使用するかどうかを判断したいと思います。これは私のデータである。ここではファンクション内でggplotにファセットを使用できません

mydf <- data.frame(
    group = rep(c("g1", "g2"), each = 16, times = 1), 
    cluster = rep(c("c1", "c2"), each = 8, times = 2), 
    score1 = c(rnorm(n = 16, mean = 10, sd = 10), rnorm(n = 16, mean = 18, sd = 10)), 
    score2 = c(rnorm(n = 16, mean = 50, sd = 10), rnorm(n = 16, mean = 33, sd = 10)) 
) 

は関数である。

myFunc <- function(data, group = NULL, group2, var1, var2) { 

    # So we don't need quotation marks in function call 
    arguments <- as.list(match.call()) 
    var1 = eval(arguments$var1, data) 
    var2 = eval(arguments$var2, data) 
    group2 = eval(arguments$cluster, data) 
    grouping = eval(arguments$group, data) 

    # Make this graph if no faceting needed 
    if (length(grouping) == 0) { 

    means <- aggregate(cbind(var1, var2) ~ group2, FUN = mean, data = data) 

    ggplot(data, aes(x = var1, y = var2, color = group2, label = group2)) + 
    stat_ellipse(type = "norm", show.legend = FALSE, geom = "polygon", alpha = 0.1) + 
    geom_text(alpha = 0.5, show.legend = FALSE) + 
    geom_text(data = means, aes(x = var1, y = var2, color = group2)) 


    # Use faceting 
    } else if (length(grouping) > 0) { 

    means <- aggregate(cbind(var1, var2) ~ grouping + group2, FUN = mean, data = data) 

    # Plot 
    ggplot(data, aes(x = var1, y = var2, color = group2, label = group2)) + 
    stat_ellipse(type = "norm", show.legend = FALSE, geom = "polygon", alpha = 0.1) + 
    geom_text(alpha = 0.5, show.legend = FALSE) + 
    geom_text(data = means, aes(x = var1, y = var2, color = group2)) + 
    facet_grid(. ~ grouping) 

    } 

} 

ので、同様に、私は関数を呼び出しています:

myFunc(data = mydf, group = NULL, group2 = cluster, var1 = score1, var2 = score2) 
myFunc(data = mydf, group = group, group2 = cluster, var1 = score1, var2 = score2) 

両方の呼び出しは、それぞれ次のエラーを与える:

# Error 1 
Error: Aesthetics must be either length 1 or the same as the data (32): x, y, colour, label 

# Error 2 
Error in combine_vars(data, params$plot_env, cols, drop = params$drop) : 
At least one layer must contain all variables used for facetting 

期待値D出力を手動でプロットを構築することにより取得することができます。

means <- aggregate(cbind(score1, score2) ~ group + cluster, FUN = mean, data = mydf) 

# without facet 
ggplot(mydf, aes(x = score1, y = score2, color = cluster, label = cluster)) + 
    stat_ellipse(type = "norm", show.legend = FALSE, geom = "polygon", alpha = 0.1) + 
    geom_text(alpha = 0.5, show.legend = FALSE) + 
    geom_text(data = means, aes(x = score1, y = score2, color = cluster)) 

# with facet 
ggplot(mydf, aes(x = score1, y = score2, color = cluster, label = cluster)) + 
    stat_ellipse(type = "norm", show.legend = FALSE, geom = "polygon", alpha = 0.1) + 
    geom_text(alpha = 0.5, show.legend = FALSE) + 
    geom_text(data = means, aes(x = score1, y = score2, color = cluster)) + 
    facet_grid(. ~ group) 

答えて

2

ここでとfacet_gridを使用せずに、基本的なstat_ellipseプロットです。私はあなたにフリルを追加させます。ここで列名は文字列として保持され、aesの代わりにaes_stringが使用され、式はas.formulaを使用して関数に渡されます。

myFunc <- function(df, var1, var2, group2, group1 = NULL) { 

    # Make this graph if no faceting needed 
    if (is.null(group1)) { 

    means_formula <- as.formula(paste(var1, "+", var2, "~", group2)) 
    means <- aggregate(means_formula, FUN = mean, data = df) 

    p <- ggplot(df, 
     aes_string(x = var1, y = var2, color = group2, label = group2)) + 
     stat_ellipse(type = "norm", show.legend = FALSE, 
      geom = "polygon", alpha = 0.1) 
    }else{ 

    means_formula <- as.formula(paste(var1,"+",var2,"~", group2,"+",group1)) 
    means <- aggregate(means_formula, FUN = mean, data = df) 

    p <- ggplot(df, 
     aes_string(x = var1, y = var2, color = group2, label = group2)) + 
     stat_ellipse(type = "norm", show.legend = FALSE, 
      geom = "polygon", alpha = 0.1) + 
     facet_grid(as.formula(paste(".~ ",group1))) 
    } 
    print(p) 
} 

myFunc(df = mydf, var1 = "score1", var2 = "score2", 
    group2 = "cluster", group1 = NULL) 

myFunc(df = mydf, var1 = "score1", var2 = "score2", 
    group2 = "cluster", group1 = "group") 

stat ellipse plot

2

まず、あなたは機能、clusterの範囲に存在しない変数にgroup2を割り当てています。交換:group2 = eval(arguments$cluster, data)group2 = eval(arguments$group2, data)と置き換えます。

第2に、動的式facet_gridが必要です。現在、グループ化はデータセットの実際のフィールドではありません。しかし、関数の引数に引用符をつけないので、関数の引数の文字列リテラルを取得する必要があります。groupは、を返して"group"を返します。

grpname = deparse(substitute(group)) 

その後のいずれかの動的as.formula文字列の連結またはreformulateであなたにfacet_gridを置き換えます:もちろん

facet_grid(as.formula(paste0(". ~ ", grpname))) 

facet_grid(reformulate(grpname)) 

を、すべてが可能

は、他の機能の変数のリストに近い上部に追加することを検討してください@P-robotで示されているように、引用された関数argsを使って動的に実行します。

関連する問題