我一直在用ggplot绘制数据。 我现在的出场是16 obs。 的3个变量。 我使用unlist使其成为一种不同的数据类型,但我仍然有错误进行绘图。 我的代码:
library(datasets) data(iris) cluster_data<-iris[-5] calcss <- function(missingvar,kval) { cluster<-kmeans(cluster_data[-missingvar],kval,nstart=100) TotWithinSS<-cluster$tot.withinss return(TotWithinSS) } kvals=list() sumsqs=list() missvars=list() for(k in 2:5){ for(var in 1:4){ kvals=rbind(kvals,k) sumsqs=rbind(sumsqs,calcss(var,k)) missvars=rbind(missvars,var) } } out<-data.frame(kvals,missvars,sumsqs) ggplot(data=out,aes(missvars,sumsqs,color=kvals))错误说:
不知道如何为列表类型的对象自动选择比例。 默认连续。 不知道如何为列表类型的对象自动选择比例。 默认连续。 不知道如何为列表类型的对象自动选择比例。 默认连续。
I'm stuck on plotting my data with ggplot. The outpit I have now is 16 obs. of 3 variables. I used unlist to make it a different data type but I still get errors to plot. My code:
library(datasets) data(iris) cluster_data<-iris[-5] calcss <- function(missingvar,kval) { cluster<-kmeans(cluster_data[-missingvar],kval,nstart=100) TotWithinSS<-cluster$tot.withinss return(TotWithinSS) } kvals=list() sumsqs=list() missvars=list() for(k in 2:5){ for(var in 1:4){ kvals=rbind(kvals,k) sumsqs=rbind(sumsqs,calcss(var,k)) missvars=rbind(missvars,var) } } out<-data.frame(kvals,missvars,sumsqs) ggplot(data=out,aes(missvars,sumsqs,color=kvals))The error says:
Don't know how to automatically pick scale for object of type list. Defaulting to continuous. Don't know how to automatically pick scale for object of type list. Defaulting to continuous. Don't know how to automatically pick scale for object of type list. Defaulting to continuous.
最满意答案
你不能在ggplot2使用list 。 也不建议在for循环中增加对象。 如果你有更大的数据,它会变得很慢。 看看如何在这里和这里更有效地做到这一点
所以你应该在rep或者vector之前预先分配对象的大小
library(datasets) library(ggplot2) data(iris) cluster_data <- iris[-5] calcss <- function(missingvar, kval) { cluster <- kmeans(cluster_data[-missingvar], kval, nstart = 100) TotWithinSS <- cluster$tot.withinss return(TotWithinSS) } kvals = rep(NA, 16) # or use kvals = vector("numeric", 16L) sumsqs = rep(NA, 16) missvars = rep(NA, 16) for(k in 2:5) { for(var in 1:4) { kvals = rbind(kvals, k) sumsqs = rbind(sumsqs, calcss(var, k)) missvars = rbind(missvars, var) } } out <- data.frame(kvals, missvars, sumsqs) ggplot(data = out, aes(missvars, sumsqs, color = kvals)) + geom_point()由decex软件包创建于2018-05-31(v0.2.0)。
You can't use list with ggplot2. It's also not recommended to grow your objects within for loop. It can get very slow if you have bigger data. See how to do it more efficiently here and here
So you should pre-allocate the size of your objects before for loop with either rep or vector
library(datasets) library(ggplot2) data(iris) cluster_data <- iris[-5] calcss <- function(missingvar, kval) { cluster <- kmeans(cluster_data[-missingvar], kval, nstart = 100) TotWithinSS <- cluster$tot.withinss return(TotWithinSS) } kvals = rep(NA, 16) # or use kvals = vector("numeric", 16L) sumsqs = rep(NA, 16) missvars = rep(NA, 16) for(k in 2:5) { for(var in 1:4) { kvals = rbind(kvals, k) sumsqs = rbind(sumsqs, calcss(var, k)) missvars = rbind(missvars, var) } } out <- data.frame(kvals, missvars, sumsqs) ggplot(data = out, aes(missvars, sumsqs, color = kvals)) + geom_point()Created on 2018-05-31 by the reprex package (v0.2.0).
更多推荐
发布评论