一个图例中有重复的变量(据我所见,这不是常见问题!)

时间:2019-01-01 10:59:48

标签: r ggplot2 legend

我有以下问题,这似乎很常见,但并非如此。我制作了一个具有线型和颜色的ggplot图表,它是手动设置的,两个图例的名称和变量标签相同,长格式为df 。产生一个图例,但每个变量显示两次。为了让您理解我想要实现的目标,我需要做一些备份。

  1. 我正在开发一个功能,该功能允许我用今年的每月支出更新数据框,然后生成不同的图以跟进预算。可以这么说,我的变量有两个“属性”。它们是特定项目,每个项目都是预测(即计划的)或实际支出。我本来想要的是让每个项目都具有一种颜色和两种线型(实线表示投影,实线表示实际支出)。因此,例如,绿色表示节省,实线表示预计节省,虚线表示实际节省。我想要两个图例,一个图例仅显示颜色(即项目),另一个图例仅显示两种线型(实线,虚线),以便读者将两者放在一起(这样也就少了)图例项)。如果有人可以解决这个问题,我将很高兴找到答案。但是,以下是我现在要解决的问题:

  2. 我现在已经放弃了这个最初的意图,并选择了一个图例,每种类型的行都获得了一个图例条目。这就是上面的介绍。尽管具有相同的图例名称和变量标签以及正确的编号,但每个变量现在出现两次。我想知道为什么我会收到这些重复条目并找到解决方案。我已经尝试了许多小时,尝试了各种各样的方法,但没有人遇到类似的问题(因为我的关键字搜索出现了更多“正常”问题)。

  3. 我还注意到一个奇怪的事情是变量“ Add。income”的行为不像其他变量,因为它只出现一次。

  4. 在数据帧中(下面)有许多NA值的原因是因为这些数字要填充到df中,然后随着年份的进行绘制。

代码:

ggplot(fin2019Long, aes(x=month, y=value, colour=variable)) +   geom_line(aes(linetype=variable)) + geom_point() +
labs(title = "Projected expenditure and saving", y = "Euros", x = "Month") +
scale_x_continuous("Month", breaks= c(1:12)) +
scale_colour_manual(name = "Items", 
                  values=c("green","green", "yellow", "yellow", "blue", "blue", "red", "red", "orange"), 
                  labels=c(rep("Living expend.", 2), rep("Debt repay.", 2), rep("Saving", 2), rep("Furn. fund", 2), "Extra pay")) +
scale_linetype_manual(name = "Items", 
                    values=c(rep(c("solid", "twodash"), 4), "twodash"), 
                    labels=c(rep("Living expend.", 2), rep("Debt repay.", 2), rep("Saving", 2), rep("Furn. fund", 2), "Extra pay"))

数据:

structure(list(month = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L), .Label = c("livingExpProj", 
"livingExp", "debtRepayProj", "debtRepay", "savingProj", "saving", 
"furnFundProj", "furnFund", "addIncome"), class = "factor"), 
value = c(1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 
1000, 1000, 1000, 1000, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 600, 600, 600, 600, 600, 600, 600, 600, 600, 
600, 600, 600, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 
500, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 100, 
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -108L
), class = "data.frame") 

1 个答案:

答案 0 :(得分:1)

variable列分成两列将使其更易于控制:

fin2019Long$type <- ifelse(grepl('Proj$', fin2019Long$variable), 'Planned', 'Spending')
fin2019Long$variable2 <- gsub('Proj$', '', fin2019Long$variable)

ggplot(fin2019Long, aes(x=month, y=value, colour=variable2)) +
    geom_line(aes(linetype=type)) + geom_point() +
    labs(title = "Projected expenditure and saving", y = "Euros", x = "Month") +
    scale_x_continuous("Month", breaks= c(1:12))

enter image description here