2017-06-29 7 views
0

I 2列のセットを有する内ggplot2の点の色を変更するは、次のようにforループ

# cluster the data 
n_k = 2:3 
for (i in seq_along(n_k)) { 
    assign(paste0("cl_", n_k[ i ]), 
      kmeans(dt[ , .(x, y) ], centers = n_k[ i ])) 
    dt[ , (paste0("cl_", n_k[ i ])) := 
    as.factor(get(paste0("cl_", n_k[ i ]))$cluster) ][] 
} 

これで、データセットdtcl_2cl_3という列を追加しました。 ggplot2で生成された2つのプロット内で、これらの2つの列を自分のカラーセットとして使用したいと思います。これまでのところ、2つのプロットを作成するためにすべてforループに入れました。機能しないのは色の指定だけです。たとえば、列cl_2は無視され、cl_3のみとみなされます。ここでは、プロットの生成は次のとおりです。

# building plots 
for (i in seq_along(n_k)) { 
    assign(paste0("p_", n_k[ i ]), 
      ggplot(data = dt, 
         aes(x = x, y = y, 
         color = get(paste0("cl_", n_k[ i ])))) + 
      geom_point() + 
      ggtitle(paste0("kmeans with ", n_k[ i ], " centers"))) 
} 

次のように私はこれらをプロット:

grid.arrange(p_2, p_3, ncol = 2) 

私を困惑何をすることは私が手動で2のプロットを構築した場合、すべてが期待と同じように動作することです。たとえば、次のようにすると正しい結果が得られます。

p_2 = ggplot(data = dt, aes(x = x, y = y, 
           color = get(paste0("cl_", n_k[ 1 ])))) + 
    geom_point() 
p_3 = ggplot(data = dt, aes(x = x, y = y, 
           color = get(paste0("cl_", n_k[ 2 ])))) + 
    geom_point() 

私が間違っていることに関するヒントはありますか?

+0

'?aes_'を見てみましょう。これは、文字列として与えられた名前で列を使用することができます –

+0

@ GregordeCillia良い呼び出しが、それは動作しませんでした... – contefranz

+1

はい私の悪い、私は 'aes_string'を意味します。 'aes_'も動作しますが、構文は少し異なります。 –

答えて

0

aes_stringを使用すると、getではなく、文字列で列を呼び出すことができます。 aes_stringでは "mixed types"が許可されていないので、xではなく"x"を使用することは大変重要です。

aes_とaes_stringは、aes_string()の場合は ""、aes_()の場合は引用符で囲んで入力を明示的に引用する必要があります。 (aes_qはaes_のエイリアスです)。これにより、aes_とaes_stringは簡単にプログラムできます。

# loading some libraries 
library(data.table) 
library(ggplot2) 
library(grid) 
library(gridExtra) 

# generating the data 
set.seed(2017) 
dt = data.table(x = rnorm(500), y = rnorm(500, 1, 0.5)) 

# cluster the data 
n_k = 2:3 
for (i in seq_along(n_k)) { 
    assign(paste0("cl_", n_k[ i ]), 
      kmeans(dt[ , .(x, y) ], centers = n_k[ i ])) 
    dt[ , (paste0("cl_", n_k[ i ])) := 
     as.factor(get(paste0("cl_", n_k[ i ]))$cluster) ][] 
} 

# building plots 
for (i in seq_along(n_k)) { 
    assign(paste0("p_", n_k[ i ]), 
      ggplot(data = dt, 
        aes_string(x = "x", y = "y", 
         color = paste0("cl_", n_k[ i ]))) + 
      geom_point() + 
      ggtitle(paste0("kmeans with ", n_k[ i ], " centers"))) 
} 

grid.arrange(p_2, p_3, ncol = 2) 
+0

はい、これで問題は解決しました。どうもありがとうございました! – contefranz

+0

私はそれをしたと思う...ごめんなさい – contefranz

関連する問題