2017-01-25 33 views
0

ggplotに渡す引数を間違って実行しようとしています。私は既存の記事で長い道のりを歩んだが、ここに壁を打った。おそらく何かばかげているかもしれませんが、ここでは(問題の場所ではないのでプロット書式のいくつかを除外しています)Rスクリプトでggplotに引数を渡す際の問題

溶けたデータセット "lagres"は両方のシナリオで同じです。

> str(lagres) 
'data.frame': 30 obs. of 4 variables: 
    $ ST  : Factor w/ 3 levels 
    $ year : Factor w/ 6 levels 
    $ variable: Factor w/ 2 levels 
    $ value : num 

最初のプロットコールは素晴らしい作品:

ggplot(lagres, aes(quarter, value, group = interaction(ERTp, variable), linetype = variable, color = ERTp, shape = variable)) 

enter image description here

もかかわらず、これは引数を受け入れ、forループのスクリプトが動作しないで再利用することで変換しようとすると、構造は実際には同じです:

timevar <- "quarter" 
grpvar <- "ERTp" 
fplot  <- function(lagres, timevar, grpvar, ylb, tlb){ 
plot <- ggplot(lagres, aes_string(x=timevar, y="value", group = interaction("variable", grpvar), linetype = "variable", color = grpvar, shape = "variable")) + 
    geom_line(size = 0.5) + geom_point(size = 3) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(y = ylb) + 
    ggtitle(paste(tlb, grpvar, today, sep = ", ")) + 
    theme(plot.title = element_text(lineheight = .8, face = "bold", hjust = 0.5)) 

fplot(lagres, timevar, grpvar) 

問題は "linetype" argにあります。この結果を値/色に関して適切なグラフで削除しているように見えますが、行は誤って接続されており、各変数/ grpに対しては別々の行はありません。

引数の構造を見ることで、さらに問題を分析しようとすると

Plot looks like this:

、それは(AESのように見える)とaes_string()は、異なるグループの相互作用を解析します。たぶんこれが問題です。生変数と "()AES" の解析製剤、私が取得:参照された引数で次に

> str(aes(quarter, value, group = interaction(ERTp, variable), linetype = variable, color = ERTp, shape = variable)) 
List of 6 
$ x  : symbol quarter 
$ y  : symbol value 
$ group : language interaction(ERTp, variable) 
$ linetype: symbol variable 
$ colour : symbol ERTp 
$ shape : symbol variable 

、 "aes_string()" メソッド:だから

> str(aes_string(timevar, "value", group = interaction(grpvar, "variable"), linetype = "variable", color = grpvar, shape = "variable")) 
List of 6 
$ group : Factor w/ 1 level "ST.variable": 1 
$ linetype: symbol variable 
$ colour : symbol ST 
$ shape : symbol variable 
$ x  : symbol quarter 
$ y  : symbol value 

、可能基を有するいずれか「言語のやりとり」と1レベルの要素の違いは違いますか?グループの相互作用が適切に出てくるように、その解析問題について何をすべきか分かりません。 "paste()"を使うことができたが、それはうまくいきませんでした。すべての引数を渡す(したがって、aes_string()式では引用符で囲まれていないテキストも)役に立たない。

> dput(lagres) 
structure(list(ST = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 3L, 1L, 2L, 
3L, 2L, 3L, 1L, 3L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("GeraghtyM", 
"Other", "WeenJ"), class = "factor"), quarter = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 
6L, 7L, 7L, 7L, 1L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 
6L, 7L, 7L, 7L), .Label = c("2015-Q2", "2015-Q3", "2015-Q4", 
"2016-Q1", "2016-Q2", "2016-Q3", "2016-Q4"), class = "factor"), 
variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label =   c("ScanLag", 
"TPADoorToLag"), class = "factor"), value = c(45.3333333333333, 
60.2857142857143, 37.6, 0, 51.375, 95.4166666666667, 26.8, 
42.75, 200, 28, 134, 68.2941176470588, 29, 42.8, 140.7, 0, 
49.2222222222222, 103.833333333333, 0, 20.125, 0, 67.75, 
48, 87, 93, 78, 49.5, 55, 65.6, 83, 59, 54, 153, 114, 111, 
83, 8.66666666666667)), .Names = c("ST", "quarter", "variable", 
"value"), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 24L, 25L, 
26L, 27L, 29L, 30L, 31L, 33L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 
42L), class = "data.frame", na.action = structure(c(22L, 23L, 
28L, 32L, 34L), .Names = c("22", "23", "28", "32", "34"), class =   "omit")) 
+0

arghには、タイプミスを避けるためにしようとしたが、最後の段落は、 "LiveTypeの" argを、LiveTypeのではないと言う必要があります。申し訳ありません – DocWeen

+0

自動スペルチェック、私は推測します: "linetype" – DocWeen

+0

プロットコード(コードの 'geom_path'のようなもの)とデータセットの小さな例を含めて質問を再現してください。質問にデータを追加する方法の例については、[here](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を参照してください。 – aosmith

答えて

0

aes_stringは、使用しているinteractionコードを読んでいません。これを回避する1つの方法は、プロットする前に、関数内のデータセットに新しい "interaction"変数を作成することです。例えば

fplot <- function(lagres, timevar, grpvar){ 
    lagres$combine = interaction(lagres[["variable"]], lagres[[grpvar]]) 
    plot <- ggplot(lagres, aes_string(x=timevar, y="value", 
             group = "combine", linetype = "variable", 
             color = grpvar, shape = "variable")) + 
     geom_line(size = 0.5) + 
     geom_point(size = 3) 
    plot 
} 
+0

優秀!本当にありがとう!できればコメント/リンクを作成してください。「言語のやりとり(ERTp、変数)」の意味と、どのようにしてAESがこれをさまざまな方法で解析するのかをよく理解しています。しかし、あなたは本当にここで私を助けてくれました。とても有難い。 – DocWeen

+0

@DocWeen本質的に 'aes_string'は文字として書かれた変数名を期待するので、' aes_string'の 'interaction'コード全体は文字である必要があります。しかし、 'interaction'では、文字以外の変数名が必要です。関連する質問と回答については、[here](http://stackoverflow.com/questions/19410781/problems-when-using-ggplot-aes-string-group-and-linetype)を参照してください。また、私の答えがあなたの問題を解決するのに役立った場合、その横のチェックマークをクリックすることができます。 – aosmith

関連する問題