我有一个包含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_2
和cl_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 :(得分: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 )