aes_string с эстетичным цветом

Чтобы получить список с двумя объектами ggplot, используйте мою функцию gscatFn2, как показано ниже. Вместо использования имени столбца «Неделя» фрейма данных я хочу использовать индекс столбца 7 для эстетического отображения, как показано ниже. Но сообщение об ошибке:

Error in sort.list(y) : 'x' must be atomic for 'sort.list'Have you called 'sort' on a list?

Должно быть что-то не так с моим эстетическим отображением color, чего я не мог понять.

df1 <- data.frame(list(Avg=c(0.282,0.282,0.282,0.733),CV=c(0.7,1.06,0.7,0.9),Lot=c("a","b","c","d"),Model=c("m1","m2","m3","m4"),Size=c("01","02","03","04"),Month=c("11","11","22","22"),Week=c("23","23","24","24")))
df2 <- data.frame(list(Avg=c(0.010,0.02,0.029,0.083),CV=c(0.04,0.9,0.4,0.1),Lot=c("a","b","c","d"),Model=c("m1","m2","m3","m4"),Size=c("01","02","03","04"),Month=c("11","11","22","22"),Week=c("23","23","24","24")))

grp2 <- list(df1, df2) 

gscatFn2 <- function(grp, ccc, ccv,  cca, cccol) {
#grp: 2 data frame, ccc: Size, ccv : CV, cca : Avg, cccol : Week 
#ggpplot object for each data frame shall return
library(ggplot2)
p <- list()
for (i in ( 1:length(grp) ) )  {
#for each data frame repeat
    #x and y
    p1 <- ggplot(grp[[i]], aes_string( x=colnames(grp[[i]])[cca],y=colnames(grp[[i]])[ccv] )) 
    #color
    p2 <- p1 +  geom_point(aes_string( color= colnames(factor(grp[[i]])[cccol])  ) ) + scale_color_manual(values= c("deepskyblue3","firebrick"))
    #accumulate
    p[[i]] <- p2
}
return(p)
}

# for testing   
pp <- gscatFn2(grp2,5,2,1,7)  # <<<- I got error "Error in sort.list(y) : 'x' must be atomic..."
print(pp[[1]])

person Soon    schedule 28.06.2017    source источник


Ответы (1)


Помимо странного способа построения графика, о котором я не буду говорить — у вас могут быть на это все веские причины — единственная проблема, которую я вижу, — это использование

colnames(factor(grp[[i]])[cccol])))

Изменение его на

 colnames(grp[[i]])[cccol]))

решает вопрос:

введите здесь описание изображения

person GGamba    schedule 28.06.2017
comment
Оно работает. Большое спасибо. Таинственно то, что без факторизации столбца может быть возможно дискретное отображение цветов? - person Soon; 28.06.2017
comment
ну да, судя по картинке. Если вы действительно обеспокоены тем, что непрерывная переменная может проскользнуть, вы можете использовать color= paste0('factor(', colnames(grp[[i]])[cccol],')') - person GGamba; 28.06.2017