以下代码生成三个图。第一个图使用来自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 ")
)
此图显示故障数据
此图显示维护和使用数据
我想将上述两个图组合成一个图,包含四个图例条目。这是我目前的尝试,但传说是不正确的
(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;应该只有一条线,没有符号。
布兰登使用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")
发布脚本:我想提一下,将上述过程应用于实际数据集需要花费一些精力。以下是该流程的摘要。
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轴字段进行排序。
答案 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))))
答案 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_
都有一种通过将指南设置为“无”来删除指南的方法。