并排绘制两个图例或两列绘制一个图例

时间:2014-04-24 19:22:34

标签: r plot legend

我有一个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)))

正如您所看到的,因素包括:cellgroup,各自级别:c("A","B","C") cellc("p","v") group }。我有pch因子级别的三种不同形状(cell)和group因子级别的两种不同颜色。

我想根据df$ydf$x指定pchcolor点,并df$pchdf$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)

产生这个情节: enter image description here

我不满意,因为我需要调整两个图例的位置以使它们正确对齐。我想知道是否有更好,更自动的方法来实现这一目标。

在同一个音符上,我们很高兴知道是否还有一种自动的方法来确定图中需要多少额外空间来拟合图例并在xlim中指明和ylim而不是手动调整它们。

最后一件事 - 如果可能的话,我更喜欢不是ggplot

的解决方案

2 个答案:

答案 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)

enter image description here

答案 1 :(得分:1)

您可能想看看ggplot2

ggplot(df, aes(y = y, x = x,shape = cell, colour = group)) + 
geom_point(aes(group = interaction(group,cell)))

产生: enter image description here

ggplot2上的文档http://docs.ggplot2.org/0.9.3.1/

另外,忘了添加: 阅读?interaction这是我在geom_point调用中用来计算因子的内容 代表细胞和群体之间的互动。