【问题标题】:Legend in multiple plot in RR中多个图中的图例
【发布时间】:2013-06-12 06:13:00
【问题描述】:

根据别人的cmets,这个帖子被分成了几个 smaller questions来自这个OP.的上一版本

在下图中,你能帮我(新手到 R)

  • 根据它们所代表的数据自定义图例,例如变量 1 的填充、变量 2 的圆点和变量 3 的线及其颜色。
  • 图例和轴名称的字母大小相同。

下图是使用data in pdf 设备生成的,具有以下布局。

m <- matrix(c(1,2,3,3,4,5),nrow = 3,ncol = 2,byrow = TRUE)
layout(mat = m,heights = c(0.47,0.06,0.47))
par(mar=c(4,4.2,3,4.2))

#Codes for Fig A and B
...

#Margin for legend
par(mar = c(0.2,0.2,0.1,0.1))
    # Code for legend
...

#Codes for Fig C and D
...

【问题讨论】:

  • 如果没有生成 2 x 2 布局的代码,我认为您不会得到答案(至少是经过测试的答案)。我也看不到“变量 1”和“变量 2”或“它们的颜色”指的是什么。
  • @maxm 也许最好使用长格式的数据,正如我在previous answer 中向您展示的那样。我很容易使用变量时间来设置图例和数据形状。
  • @DWin 我同意你对datacode 的看法。
  • @agstudy 是的,我发现长格式在多图图中很有用。谢谢。

标签: r graph axis-labels


【解决方案1】:

使用latticeExtra中的doubleYScale和长格式的数据(见我的previous answer),可以简化工作:

  1. 无需创建自定义布局来叠加多个绘图
  2. 无需手动创建图例

这个想法是创建 2 个单独的对象,然后使用 doubleYScale 合并它们。后者将创建第二个轴。我希望我能得到你的 ploygon 想法,因为目前还不清楚你为什么要在你的 OP 中反转它。

library(latticeExtra)
obj1 <- xyplot(Variable~TimeVariable|Type,type='l',
               groups=time,               scales=list(x=list(relation='free'),
                                                      y=list(relation='free')),
               auto.key=list(columns = 3,lines = TRUE,points=FALSE) ,

       data = subset(dat.l,time !=1))
obj2 <- xyplot(Variable~TimeVariable|Type,
               data = subset(dat.l,time ==1),type='l',
               scales=list(x=list(alternating=2),
                           auto.key=list(columns = 3,lines = TRUE,points=FALSE),
                           y=list(relation='free')),
               panel=function(x,y,...){
         panel.xyplot(x,y,...)
         panel.polygon(x,y,col='violetred4',border=NA,alpha=0.3)
               })


doubleYScale(obj1, obj2, add.axis = TRUE,style1 = 0, style2 = 1)

【讨论】:

  • 感谢您提供另一种绘图方式。但是我想绘制与我的问题类似的图表。
【解决方案2】:

尝试以下方法:

1) 对于图例部分

数据可以在https://www.dropbox.com/s/4kgq8tyvuvq22ym/stackfig1_2.csv上找到

我使用的代码如下:

data <- read.csv("stackfig1_2.csv")
library(Hmisc)

label1=c(0,100,200,300)
plot(data$TimeVariable2C,data$Variable2C,axes=FALSE,ylab="",xlab="",xlim=c(0,24),
     ylim=c(0,2.4),xaxs="i",yaxs="i",pch=19)
lines(data$TimeVariable3C,data$Variable3C)
axis(2,tick=T,at=seq(0.0,2.4,by=0.6),label= seq(0.0,2.4,by=0.6))
axis(1,tick=T,at=seq(0,24,by=6),label=seq(0,24,by=6))
mtext("(C)",side=1,outer=F,line=-10,adj=0.8)
minor.tick(nx=5,ny=5)

par(new=TRUE)
plot(data$TimeVariable1C,data$Variable1C,axes=FALSE,xlab="",ylab="",type="l",
     ylim=c(800,0),xaxs="i",yaxs="i")
axis(3,xlim=c(0,24),tick=TRUE,at= seq(0,24,by=6),label=seq(0,24,by=6),col.axis="violetred4",col="violetred4")
axis(4,tick=TRUE,at= label1,label=label1,col.axis="violetred4",col="violetred4")
polygon(data$TimeVariable1C,data$Variable1C,col='violetred4',border=NA)


legend("top", legend = c("Variable A","Variable B","Variable C"), col = c("black","violetred4","black"),
       ncol = 2, lwd =c("","",2),pch=c(19,15,NA),cex=1)

输出如下:

2) 要使字体大小相同,请使用参数cex 并使其在任何地方都相同。

【讨论】:

  • 图例格式效果很好。然而,上图中的图例和轴名称都给出了 cex=1,但文本大小似乎仍然不同。我猜 cex 是一个相对参数。我还检查了(文本大小 = ps*cex)。我对绘图行和图例有不同的高度设置,并且 par(mar) 也不同。可能是这些设置以某种方式负责。
  • @maxm:确保使用cex.axis 控制轴刻度标签文本大小,并使用cex.lab 控制轴标签文本大小。
猜你喜欢
  • 2012-05-10
  • 2018-04-09
  • 1970-01-01
  • 2019-11-17
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多