我已经能够在ggplot中成功创建一个跨性别百分比的dotpot。但是,我想突出显着的差异。我认为我可以通过子集化和使用last_plot()来实现这一点。
这是我的数据:
require(ggplot2)
require(reshape2)
prog <- c("Honors", "Academic", "Social", "Media")
m <- c(30,35,40,23)
f <- c(25,40,45,15)
s <- c(0.7, 0.4, 0.1, 0.03)
temp <- as.data.frame(cbind(prog, m, f, s), stringsAsFactors=FALSE)
first <- temp[,1:3]
first.melt <- melt(first, id.vars = 'prog', variable.name = 'Gender', value.name = 'Percent')
first.melt <- as.data.frame(cbind(first.melt,temp[,4]), , stringsAsFactors=FALSE)
names(first.melt) <- c("program", "Gender", "Percent", "sig")
first.melt$program <- as.factor(first.melt$program)
这是我对我的程序变量进行逆序的地方,所以当绘制时,如果从上到下按字母顺序排列。
first.melt[,1] = with(first.melt, factor(first.melt[,1], levels = rev(levels(first.melt[,1]))))
first.melt$sig <- as.numeric(as.character(first.melt$sig))
first.melt$Percent <- as.numeric(as.character(first.melt$Percent))
现在,我分组......
first.melt.ns <- subset(first.melt,sig > 0.05)
first.melt.sig <- subset(first.melt,sig <= 0.05)
ggplot(first.melt.ns, aes(program, y=Percent, shape=Gender)) +
geom_point(size=3) +
coord_flip() +
scale_shape_manual(values=c("m"=1, "f"=5))
ggplot的第一次运行得到了我的非重要程序对 - 并且它的顺序正确 - 所以,我为男性和女性添加了两个新点(使它们成为可靠的,以吸引注意力作为重要对) :
last_plot() +
geom_point(data=first.melt.sig, aes(program[Gender=="m"], y=Percent[Gender=="m"]), size=3, shape=19) +
geom_point(data=first.melt.sig, aes(program[Gender=="f"], y=Percent[Gender=="f"]),size=4, shape=18)
这些点得到了很好的补充 - ggplot有效。但请注意我的程序轴 - 这是正确的,但现在已经逆转。
答案 0 :(得分:0)
首先,你真的应该避免as.data.frame(cbind(...))
。它大大增加了准备数据所需的工作量。创建数据帧的功能(自然地)data.frame
。使用它!
你在这里所做的基本上是试图绕过只有一个形状比例的限制。这可能是最简单的方法:
temp <- data.frame(prog,m,f,s)
first <- temp[,1:3]
first.melt <- melt(first, id.vars = 'prog', variable.name = 'Gender', value.name = 'Percent')
first.melt$sig <- rep(temp$s,times = 2)
first.melt[,1] = with(first.melt, factor(first.melt[,1], levels = rev(levels(first.melt[,1]))))
first.melt.sig <- subset(first.melt,sig < 0.05)
first.melt$Percent[first.melt$sig < 0.05] <- NA
ggplot() +
geom_point(data = first.melt,aes(x = prog,y = Percent,shape = Gender),size = 3) +
geom_point(data = first.melt.sig[1,],aes(x = prog,y = Percent),shape = 19) +
geom_point(data = first.melt.sig[2,],aes(x = prog,y = Percent),shape = 18) +
coord_flip() +
scale_shape_manual(values=c("m"=1, "f"=5))
一般情况下,要构建ggplot
代码,以便在aes
内对数据框进行子集,不变量。这既棘手又危险,因为ggplot
假定您在aes
内传递的内容有某些事情,以便评估正常工作。