2017-06-29 115 views
0

我有2列的数据集如下点的颜色:在GGPLOT2更改内的for循环

# 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)) 

我运行多个k均值使用图2和3中心kmeans()功能如下:

# 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) ][] 
} 

所以,现在我已经添加列cl_2cl_3到我的数据集dt。我想用这两列作为我在ggplot2生成的两个图中的颜色集。到目前为止,我再次把所有的东西都放在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) 

令我百思不解的是,如果我手动建立了两个地块,按预期一切正常而已。例如,执行以下操作会产生正确的结果:

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。重要的是艰难的,你也可以使用"x"而非x因为“混合型”的不aes_string不允许的。

aes_和aes_string要求您使用“”替代aes_string()或者使用quote或〜for 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