r - 为 geom_polygon 添加图例

标签 r ggplot2 legend

我正在尝试使用 geom_point 生成散点图其中点由平滑多边形外接,geom_polygon .

这是我的点数据:

set.seed(1)
df <- data.frame(x=c(rnorm(30,-0.1,0.1),rnorm(30,0,0.1),rnorm(30,0.1,0.1)),y=c(rnorm(30,-1,0.1),rnorm(30,0,0.1),rnorm(30,1,0.1)),val=rnorm(90),cluster=c(rep(1,30),rep(2,30),rep(3,30)),stringsAsFactors=F)

我根据 df$val 的间隔为每个点着色是在。这是间隔数据:
intervals.df <- data.frame(interval=c("(-3,-2]","(-2,-0.999]","(-0.999,0]","(0,1.96]","(1.96,3.91]","(3.91,5.87]","not expressed"),
                           start=c(-3,-2,-0.999,0,1.96,3.91,NA),end=c(-2,-0.999,0,1.96,3.91,5.87,NA),
                           col=c("#2f3b61","#436CE8","#E0E0FF","#7d4343","#C74747","#EBCCD6","#D3D3D3"),stringsAsFactors=F)

为点分配颜色和间隔:
df <- cbind(df,do.call(rbind,lapply(df$val,function(x){
  if(is.na(x)){
    return(data.frame(col=intervals.df$col[nrow(intervals.df)],interval=intervals.df$interval[nrow(intervals.df)],stringsAsFactors=F))
  } else{
    idx <- which(intervals.df$start <= x & intervals.df$end >= x)
    return(data.frame(col=intervals.df$col[idx],interval=intervals.df$interval[idx],stringsAsFactors=F))
  }
})))

为将显示每个间隔的腿准备颜色:
df$interval <- factor(df$interval,levels=intervals.df$interval)
colors <- intervals.df$col
names(colors) <- intervals.df$interval

这是我构建平滑多边形的地方(使用此 link 提供的函数):
clusters <- sort(unique(df$cluster))
cluster.cols <- c("#ff00ff","#088163","#ccbfa5")


splinePolygon <- function(xy,vertices,k=3, ...)
{
  # Assert: xy is an n by 2 matrix with n >= k.
  # Wrap k vertices around each end.
  n <- dim(xy)[1]
  if (k >= 1) {
    data <- rbind(xy[(n-k+1):n,], xy, xy[1:k, ])
  } else {
    data <- xy
  }
  # Spline the x and y coordinates.
  data.spline <- spline(1:(n+2*k), data[,1], n=vertices, ...)
  x <- data.spline$x
  x1 <- data.spline$y
  x2 <- spline(1:(n+2*k), data[,2], n=vertices, ...)$y
  # Retain only the middle part.
  cbind(x1, x2)[k < x & x <= n+k, ]
}

library(data.table)
hulls.df <- do.call(rbind,lapply(1:length(clusters),function(l){
  dt <- data.table(df[which(df$cluster==clusters[l]),])
  hull <- dt[, .SD[chull(x,y)]]
  spline.hull <- splinePolygon(cbind(hull$x,hull$y),100)
  return(data.frame(x=spline.hull[,1],y=spline.hull[,2],val=NA,cluster=clusters[l],col=cluster.cols[l],interval=NA,stringsAsFactors=F))
}))
hulls.df$cluster <- factor(hulls.df$cluster,levels=clusters)

这是我的 ggplot命令:
library(ggplot2)

p <- ggplot(df,aes(x=x,y=y,colour=interval))+geom_point(cex=2,shape=1,stroke=1)+labs(x="X", y="Y")+theme_bw()+theme(legend.key=element_blank(),panel.border=element_blank(),strip.background=element_blank())+scale_color_manual(drop=FALSE,values=colors,name="DE")
p <- p+geom_polygon(data=hulls.df,aes(x=x,y=y,group=cluster),color=hulls.df$col,fill=NA)

它产生:

enter image description here

我的问题是如何在点的图例下为多边形添加图例?我想要一个根据簇颜色和每行旁边相应簇号着色的 3 行图例?

最佳答案

输出略有不同,仅更改代码的最后一行,就可以解决您的目的:

p+geom_polygon(data=hulls.df,aes(x=x,y=y,group=cluster, fill=cluster),alpha=0.1)

enter image description here

关于r - 为 geom_polygon 添加图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39739327/

相关文章:

r - 如何通过包含 NA 作为级别的因子过滤 data.frame

r - ggplot2 中的颜色错误(grDevices::col2rgb(colour, TRUE) 中的错误:无效的 RGB 规范)

r - 为列表中的每个数据框创建一个包含列总和的新行

r - 如何在ggplot中重新排序连续变量?

r - 在 coord_flip 之后翻转分组条形图中数据的顺序

r - 如何向 ggplot 图例添加新的(自定义)变量

r - 如何在带有条形图和点图的图中显示图例?

r - ggplot图例显示透明度和填充颜色

r - 在 dplyr 的特定列范围内使用 mutate case_when()

r - 如何在 R 中设置一个包含自身的类(对于树)?