使用ggplot绘制多个geom_point组周围的轮廓

13

我目前使用下面的代码绘制这个图像: enter image description here

我想要做的是让每个组的轮廓线依次连接组内的所有点 - 而不是跳过某些点,就像当前代码所做的那样。另外,我希望每个轮廓线都有一个半透明的填充。感谢任何帮助。

library(ggplot2)
library(reshape)
library(car)

G1 <- 1:10
G2 <- 11:20
G3 <- 21:30
G4 <- 31:35
G5 <- 36:41

sdata <- read.csv("http://dl.dropbox.com/u/58164604/sdata.csv", stringsAsFactors = FALSE)
pdata<-melt(sdata, id.vars="Var")

VarArea <- data.frame(unique(pdata$Var))
VarFinalMin <-c()
for (g in 1:max(VarArea))
{
VarNum<-pdata[which(pdata$Var==g),1:c(ncol(pdata))]
VarN <- g
VarMin <- min(VarNum$value)
VarMinN <- cbind(VarN, VarMin)
VarFinalMin <- rbind(VarFinalMin,VarMinN) 
}
VFinalMin <- data.frame(VarFinalMin)
colnames(VFinalMin)<-c("Variable", "Value")

VarFinalMax <-c()
for (g in 1:max(VarArea))
{
VarNum<-pdata[which(pdata$Var==g),1:c(ncol(pdata))]
VarN <- g
VarMax <- max(VarNum$value)
VarMaxN <- cbind(VarN, VarMax)
VarFinalMax <- rbind(VarFinalMax,VarMaxN)
}
VFinalMax <- data.frame(VarFinalMax)
colnames(VFinalMax)<-c("Variable", "Value")

VFinal<-rbind(VFinalMin, VFinalMax)
VFinal$Group <- recode(VFinal$Variable, "G1 = 'A'; G2 = 'B'; G3 = 'C'; G4 = 'D'; G5 = 'E'")

ggplot(VFinal, aes(Variable, Value, colour = Group)) + geom_point()
find_hull <- function(VFinal) VFinal[chull(VFinal$Variable, VFinal$Value), ]
hulls <- ddply(VFinal, "Group", find_hull)
ggplot(VFinal, aes(Variable, Value, colour = Group)) + geom_point() + geom_polygon(data = hulls, fill = NA)

2
截图,并提供包括库调用在内的完全可重现的代码 - 对于优秀问题,加上一个赞。 - SlowLearner
1个回答

13
如果您将形状的底部和顶部按升序和降序重排,只需在原始数据框上使用 geom_polygon 即可跳过所有凸包相关内容:
VLarge <- VFinal[which(VFinal$Value > 25000),]
VLarge <- VLarge[order(-VLarge$Variable, VLarge$Group),]
VSmall <- VFinal[which(VFinal$Value <= 25000),]
VSmall <- VSmall[order(VSmall$Variable, VSmall$Group),]
VFinal <- rbind(VSmall, VLarge)
ggplot(VFinal, aes(Variable, Value, colour = Group)) + geom_point() + 
    geom_polygon(aes(fill = Group), alpha = 0.3)

这里输入图片描述


啊,你比我快了……干得好 - SlowLearner
1
半透明填充可以通过调整@Noel代码的最后一行来获得,将其修改为geom_polygon(aes(fill = Group, alpha = 0.3)) - SlowLearner
HT @SlowLearner。已添加到答案中。 - Noah
谢谢Noah和SlowLearner! - Chris
1
+1!聪明的解决方案!也许你可以跳过 VSmall <- VSmall[order(VSmall$Variable, VSmall$Group),],因为数据已经按正确顺序排列。 - agstudy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接