在绘制来自两个数据帧的数据时校正图例,一些行具有符号

时间:2014-10-10 20:07:46

标签: r plot legend

以下代码生成三个图。第一个图使用来自df_fault的数据,并绘制带有来自df_maint的符号的线,并且该图也可以。问题在于第3个图,它将来自df_fault的符号与来自df_maint的行组合在一起。图例不正确,有两个图例,一个用于线条,一个用于符号。如何使用四个条目获得一个正确的图例。

创建一些示例数据

library(zoo)
library(ggplot2)

rDates <- function(N, st="2012/01/01", et="2012/12/31") {
  st <- as.POSIXct(as.Date(st))
  et <- as.POSIXct(as.Date(et))
  dt <- as.numeric(difftime(et,st,unit="sec"))
  ev <- sort(runif(N, 0, dt))
  rt <- st + ev
}

first_maint <- as.POSIXct(strptime("2014/01/01", "%Y/%m/%d")) 
last_maint <- as.POSIXct(strptime("2014/12/31", "%Y/%m/%d")) 

first_fault <- as.POSIXct(strptime("2014/05/01", "%Y/%m/%d")) 
last_fault <- as.POSIXct(strptime("2014/07/31", "%Y/%m/%d")) 

set.seed(31)
nMDates=40
nFDates=10
rMaintDates <- rDates(nMDates,first_maint,last_maint)
rFaultDates <- rDates(nFDates,first_fault,last_fault)

df_fault <- data.frame(date = rFaultDates, 
                       type = "Non-Op",
                       ci = runif(nFDates,.7,1.8),stringsAsFactors=FALSE)
df_fault$type[sample(1:nFDates,3)] = "Advisory"


z_hr <- zoo(c(0,0,9.9,9.9),c(first_maint,first_fault,last_fault,last_maint))
z_maint <- zoo(,rMaintDates[c(-1,-nMDates)])
z_hr_maint_a <- merge(z_hr,z_maint)
z_hr_maint <- na.approx(z_hr_maint_a)
z_repair <- zoo(c(0,3000,5000,8000),c(first_maint,first_fault,last_fault,last_maint))
z_repair_maint_a <- merge(z_repair,z_maint)
z_repair_maint <- na.approx(z_repair_maint_a)

df_maint <- data.frame(date=index(z_hr_maint),
                       hrs=coredata(z_hr_maint)/9.8,
                       repairs=coredata(z_repair_maint)/8000)

绘制样本数据,这些示例有效

rpr_title = "repairs/8000"
flt_title = "hrs/9.8"
(gp2 <- ggplot(data=df_fault,aes(x=date, y=ci, color=type)) +
   labs(x="Date (2014)", y="CI Amplitude",title="Sample, this plot is fine, df_fault") +
   geom_line(aes(group=type,shape=type))+ 
   geom_point(aes(group=type,shape=type),size=4)+ 
   theme(plot.title=element_text( size=12),
         axis.title=element_text( size=8)) ) 
(gp2a <- ggplot() + geom_line(data=df_maint,aes(x=date,y=repairs,color=rpr_title))+
  geom_line(data=df_maint,aes(x=date,y=hrs,color=flt_title))+
   labs(x="Date (2014)", y="CI Amplitude",title="Sample, this plot is fine, df_maint ") 
 )

此图显示故障数据 Plot of fault data

此图显示维护和使用数据 enter image description here

我想将上述两个图组合成一个图,包含四个图例条目。这是我目前的尝试,但传说是不正确的

(gp2b <- gp2 + geom_line(data=df_maint,aes(x=date,y=repairs,color=rpr_title))+
   geom_line(data=df_maint,aes(x=date,y=hrs,color=flt_title))+
   labs(x="Date (2014)", y="CI Amplitude",title="Sample, this plot the legend is wrong") 
 )

这个情节,有两个传说,都没有一个是正确的。第一个&#34;类型&#34;图例中的符号符号错误,显示所有行的圆圈符号。第二个&#34;类型&#34;图例显示两个黑色符号,因此颜色不正确。我想删除第二个图例,第一个图例正确显示线条和颜色。而且,如果没有符号的线条可以更宽,那将是很好的。 &#34;咨询&#34;的传奇线/符号是正确的。 &#34;非操作&#34;的图例条目应该有一个三角形而不是圆形。 &#34; hrs / 9.8&#34;的图例条目和#34; repair / 8000&#34;应该只有一条线,没有符号。

enter image description here

布兰登使用meld的建议有所帮助,但下面的情节仍然没有传说正确...

names(df_fault)[2:3] <- c("variable","value") # for rbind 
dat <- melt(df_maint, c("date")) # melted
dat <- rbind(dat, df_fault)

p1 <- ggplot(dat, aes(date,value, group = variable, color = variable)) + geom_line()
p1 + geom_point(data = 
                  dat[dat$variable %in% c("Advisory","Non-Op"),], 
                aes(date,value, group = variable, color = variable, shape=variable)) + 
  scale_colour_discrete(name  ="Fleet",
                        breaks=c("hrs", "repairs","Advisory","Non-Op"),
                        labels=c("usage hrs", "maint repairs","Advisory Faults","Non-Op Faults")) +
  scale_shape_discrete(name  ="Fleet",
                       breaks=c("hrs", "repairs","Advisory","Non-Op"),
                       labels=c("usage hrs", "maint repairs","Advisory Faults","Non-Op Faults"),
                       guide = "none")

enter image description here

发布脚本:我想提一下,将上述过程应用于实际数据集需要花费一些精力。以下是该流程的摘要。

1)识别x轴变量,并对变量进行分组。

2)在两个数据框中,将x轴变量和组变量重命名为相同的名称

3)使用熔化两次(示例仅使用一次)生成熔化的数据框。将x轴和组变量用作is.vars。指定要绘制为measure.vars的变量。

3b)对熔化的数据帧进行检测。您需要查看X轴变量名称和分组变量名称,然后是字段变量和值。字段变量具有与不同y轴名称对应的文本值。

4)使用rbind组合两个融合的数据帧

5)继续前进步骤3和4,以便了解数据的存储

6)绘制所有数据的行。在此步骤中使用+指南(color = guide_legend(title =&#34; Fleet&#34;))包括图例标题的修改。我在示例中没有看到此命令。

7)从具有符号的数据的熔化数据帧创建子集。添加符号,但不要在示例中添加符号+ scale_shape_discrete(name =&#34; Fleet&#34;,guide =&#34; none&#34;)中的第二个图例。

8)使用+指南调整图例线符号(color = guide_legend(override.aes = list(shape = c(32,32,16,17))))

9)一旦您看到带有某些符号和正确图例的线条的标称图,您可能需要在对合并的熔化数据框进行排序后重复上述过程,以便在前面获得正确的线条/符号。您可能希望对变量和x轴字段进行排序。

2 个答案:

答案 0 :(得分:2)

通过添加指南,并将形状指定为无形状(32),并匹配其他符号(16,17),绘图正确

p1 <- ggplot(dat, aes(date,value, group = variable, color = variable)) + geom_line(size=1)
p1 + geom_point(data = 
                  dat[dat$variable %in% c("Advisory","Non-Op"),], 
                aes(date,value, group = variable, color = variable, shape=variable),size=3) + 
  scale_colour_discrete(name  ="Fleet",
                        breaks=c("hrs", "repairs","Advisory","Non-Op"),
                        labels=c("usage hrs", "maint repairs","Advisory Faults","Non-Op Faults")) +
  scale_shape_discrete(name  ="Fleet",
                       guide = "none") +
  guides(colour = guide_legend(override.aes = list(shape = c(32,32,16,17))))

enter image description here

答案 1 :(得分:1)

如果有疑问,请融化。请参阅以下示例:

library(reshape2)
library(ggplot2) 
names(df_fault)[2:3] <- c("variable","value") # for rbind 
dat <- melt(df_maint, c("date")) # melted
dat <- rbind(dat, df_fault)

p1 <- ggplot(dat, aes(date,value, group = variable, color = variable)) + geom_line()
p1 + geom_point(data = 
    dat[dat$variable %in% c("Advisory","Non-Op"),], 
    aes(date,value, group = variable, color = variable, shape=variable)) + 
scale_shape(guide = "none")

请注意,我在geom_point()电话中指定了“数据”。每个scale_都有一种通过将指南设置为“无”来删除指南的方法。