首页 文章

R - 添加质心以散点图

提问于
浏览
4

我有一个数据集两个连续变量和一个因子变量(两个类) . 我想创建一个带有两个质心(每个类一个)的散点图,其中包含R中的误差条 . 质心应位于每个类的x和y的平均值 .

我可以使用ggplot2轻松创建散点图,但我无法弄清楚如何添加质心 . 是否可以使用ggplot / qplot来做到这一点?

这是一些示例代码:

x <- c(1,2,3,4,5,2,3,5)
y <- c(10,11,14,5,7,9,8,5)
class <- c(1,1,1,0,0,1,0,0)
df <- data.frame(class, x, y)
qplot(x,y, data=df, color=as.factor(class))

1 回答

  • 13

    这是你的想法吗?

    centroids <- aggregate(cbind(x,y)~class,df,mean)
    ggplot(df,aes(x,y,color=factor(class))) +
      geom_point(size=3)+ geom_point(data=centroids,size=5)
    

    这将创建一个单独的数据框 centroids ,其中包含 xyclass 列,其中 xy 是类的平均值 . 然后我们使用 centroid 作为数据集添加第二个点几何图层 .

    这是一个稍微有趣的版本,在聚类分析中很有用 .

    gg <- merge(df,aggregate(cbind(mean.x=x,mean.y=y)~class,df,mean),by="class")
    ggplot(gg, aes(x,y,color=factor(class)))+geom_point(size=3)+
      geom_point(aes(x=mean.x,y=mean.y),size=5)+
      geom_segment(aes(x=mean.x, y=mean.y, xend=x, yend=y))
    

    EDIT 对OP评论的回应 .

    可以使用 geom_errorbar(...)geom_errorbarh(...) 添加垂直和水平误差线 .

    centroids <- aggregate(cbind(x,y)~class,df,mean)
    f         <- function(z)sd(z)/sqrt(length(z)) # function to calculate std.err
    se        <- aggregate(cbind(se.x=x,se.y=y)~class,df,f)
    centroids <- merge(centroids,se, by="class")    # add std.err column to centroids
    ggplot(gg, aes(x,y,color=factor(class)))+
      geom_point(size=3)+
      geom_point(data=centroids, size=5)+
      geom_errorbar(data=centroids,aes(ymin=y-se.y,ymax=y+se.y),width=0.1)+
      geom_errorbarh(data=centroids,aes(xmin=x-se.x,xmax=x+se.x),height=0.1)
    

    如果你想计算95%的置信度而不是std . 错误,替换

    f <- function(z)sd(z)/sqrt(length(z)) # function to calculate std.err
    

    f <- function(z) qt(0.025,df=length(z)-1, lower.tail=F)* sd(z)/sqrt(length(z))
    

相关问题