我有一个data.frame
,其中包含我要绘制的x和y值(y与x)。有两个因素,一个有三个级别,另一个有两个级别,每个点都分配到:
df = data.frame(x=c(1:90),y=runif(90,5,10),pch=c(rep(0,30),rep(5,30),rep(6,30)),col=c(rep("red",45),rep("blue",45)),cell=c(rep("A",30),rep("B",30),rep("C",30)),group=c(rep("p",45),rep("v",45)))
正如您所看到的,因素包括:cell
和group
,各自级别:c("A","B","C")
cell
和c("p","v")
group
}。我有pch
因子级别的三种不同形状(cell
)和group
因子级别的两种不同颜色。
我想根据df$y
和df$x
指定pch
与color
点,并df$pch
和df$col
两个传说并排:一个用于细胞因子水平,另一个用于组因子水平,或者一个图例用两个因子两列。
到目前为止,我正在玩这个:
plot(df$x,df$y,pch=df$pch,col=as.character(df$col),xlim=c(min(df$x),max(df$x)+5),ylim=c(min(df$y),max(df$y)+2))
legend("topright",title="Cell",legend=c("A","B","C"),col="black",pch=c(0,5,6),bty="n",border=F)
legend(x=75,y=12,title="Group",legend=c("p","v"),col=c("red","blue"),lty=c(1,1),bty="n",border=F)
产生这个情节:
我不满意,因为我需要调整两个图例的位置以使它们正确对齐。我想知道是否有更好,更自动的方法来实现这一目标。
在同一个音符上,我们很高兴知道是否还有一种自动的方法来确定图中需要多少额外空间来拟合图例并在xlim
中指明和ylim
而不是手动调整它们。
最后一件事 - 如果可能的话,我更喜欢不是ggplot
的解决方案答案 0 :(得分:4)
这有点hackish,但如果您在ncol
中指定legend
参数,则可以强制图例有多列。这样,您将两个legend
调用合并为一个,让R处理列创建/间距。
这个hackish部分是你只需要在图例标题上手动设置间距,这样你的“Cell”和“Group”标签就会落到他们需要的位置:
plot(df$x, df$y, pch=df$pch, col=as.character(df$col),
xlim=c(min(df$x),max(df$x)+5), ylim=c(min(df$y),max(df$y)+2))
legend("topright", title="Cell Group", # << THIS IS THE HACKISH PART
legend=c("A","B","C","p","v"),
col=c(rep("black",3),'red','blue'), pch=c(0,5,6,1,1),
bty="n", border=F, ncol=2)
答案 1 :(得分:1)
您可能想看看ggplot2
ggplot(df, aes(y = y, x = x,shape = cell, colour = group)) +
geom_point(aes(group = interaction(group,cell)))
产生:
ggplot2上的文档http://docs.ggplot2.org/0.9.3.1/
另外,忘了添加:
阅读?interaction
这是我在geom_point
调用中用来计算因子的内容
代表细胞和群体之间的互动。