在for循环中更改ggplot2中的点的颜色

时间:2017-06-29 09:17:02

标签: r plot ggplot2

我有一个包含2列的数据集,如下所示:

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

我使用kmeans()函数运行多个k-means,使用2和3个中心,如下所示:

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

我做错了什么提示?

1 个答案:

答案 0 :(得分:1)

您可以使用aes_string通过字符串调用列,而不是使用get。重要的是,你也使用"x"而不是x,因为"混合类型" aes_string中不允许使用。

  

aes_和aes_string要求您使用""明确引用输入。对于aes_string(),或者使用quote或〜对于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 )