使用ggplot绘制kmeans聚类结果时遇list类型尺度选择报错
解决ggplot绘图时的列表类型报错问题
嘿,我一眼就看出问题出在哪啦!你遇到的Don't know how to automatically pick scale for object of type list报错,根本原因是你生成的out数据框里的三个列都是列表(list)类型,而ggplot需要的是数值型向量才能正确映射到坐标轴和颜色属性上。
问题根源
你看代码里初始化kvals、sumsqs、missvars时用的是list(),然后循环里用rbind()来拼接元素——这种方式会让最终的data.frame每一列都保留列表结构,而不是ggplot能识别的数值向量。
修正方案
我们只需要把这些变量改成用向量来存储,而不是列表,就能解决问题。下面是修正后的完整代码:
library(datasets) library(ggplot2) # 别忘了加载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 <- numeric() sumsqs <- numeric() missvars <- numeric() for(k in 2:5){ for(var in 1:4){ kvals <- c(kvals, k) sumsqs <- c(sumsqs, calcss(var,k)) missvars <- c(missvars, var) } } out<-data.frame(kvals, missvars, sumsqs) # 加上绘图图层,比如散点+折线 ggplot(data=out,aes(x=missvars, y=sumsqs, color=as.factor(kvals))) + geom_point(size=3) + geom_line(aes(group=kvals)) + labs(x="Missing Variable Index", y="Total Within-Cluster Sum of Squares", color="Number of Clusters (k)")
关键修改点
- 把
list()初始化改成numeric(),用c()来追加元素,这样生成的是纯数值向量 - 把
kvals转成因子(as.factor(kvals)),因为k是离散的聚类数,作为颜色映射更合理 - 补充了
ggplot2的加载(原代码没写,运行时可能也会报错) - 添加了
geom_point()和geom_line()图层,不然原代码只会生成空的绘图对象
这样修改后,ggplot就能正确识别所有变量的类型,不会再弹出列表类型的报错啦!
内容的提问来源于stack exchange,提问作者Deborah Paul
相关产品推荐
相关产品推荐

