使用last_plot()时ggplot轴顺序(因子)会发生变化

时间:2014-03-21 23:53:15

标签: r graphics ggplot2

我已经能够在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有效。但请注意我的程序轴 - 这是正确的,但现在已经逆转。

1 个答案:

答案 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内传递的内容有某些事情,以便评估正常工作。