【问题标题】:Not able to merge two legends无法合并两个图例
【发布时间】:2019-09-10 13:31:47
【问题描述】:

enter image description here

我已将堆积条形图和折线图绘制在一个具有两个不同数据集的图中。我得到了他们两个独立的传说。我已经尝试了所有可能的事情。 请查找附件代码。

alldata = data.frame(x, aircargo, autototal, govtreceipts, 
iipconsumer,nongimports, railfreight)
linedata = data.frame(x,ceii)
melteddata = melt(alldata,id.vars="x")
plotS1 <- ggplot(melteddata)
plotS1 +  geom_bar(aes(x=ordered_x,y=value,factor=variable,fill=variable, 
                       order=-as.numeric(variable)), stat="identity") +
  geom_line(data=linedata, aes(x=as.numeric(ordered_x),y=ceii, color = "CEII"), lwd=1.5) + 
  scale_color_manual( values = c("#000000")) + 
  scale_fill_manual(name = "Components", values = c("#0000FF", "#FFC0CB", "#00FFFF", "#00FF00", "#FF00FF", "#20B2AA", "#000000")) + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + theme(plot.background = element_rect(fill = "#BFD5E3")) + 
  ggtitle("Monthly Contribution by Components (3 month MA)") + 
  theme( panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + labs( y = "", x = "") + 
  scale_y_continuous(labels = c("-0.30","-0.25","-0.2","-0.15","-0.10","-0.05", "0.00", "0.05", "0.10", "0.15", "0.20", "0.25", "0.30"), breaks = c(-0.30, -0.25, -0.20, -0.15, -0.10, -0.05, 0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30)) 

数据集 -

aircargo <- c(-0.027,   0.028,  0.044,  0.011,  0.041,  0.030,  -0.028, 0.017,  0.001,  0.060,  -0.040, 0.016,  0.006,  -0.040, -0.003, 0)

autototal <- c(0.061,   -0.004, 0.009,  0.024,  -0.026, 0.025,  -0.029, 0.000,  -0.015, -0.016, 0.026,  -0.062, 0.034,  0.002,  -0.081, -0.005)

govtreceipts <- c(-0.001,   0.001,  -0.005, 0.031,  -0.023, 0.000,  -0.009, 0.005,  0.002,  -0.005, 0.004,  0.000,  0.004,  -0.003, 0,  0)

iipconsumer <- c(0.043, -0.014, 0.041,  -0.035, 0.001,  0.001,  0.040,  0.010,  -0.006, 0.013,  0.001,  -0.006, -0.002, -0.011, -0.033, 0)

nongimports <- c(0.018, -0.008, 0.015,  -0.004, 0.019,  -0.010, 0.008,  0.007,  -0.021, 0.006,  -0.002, -0.007, 0.009,  -0.017, 0.005,  0)

railfreight <- c(0.014, -0.015, 0.031,  0.103,  -0.041, 0.025,  -0.044, 0.061,  -0.050, 0.092,  -0.045, 0.011,  -0.007, 0.050,  0.100,  -0.015)

x <- c("Jan-18",    "Feb-18",   "Mar-18",   "Apr-18",   "May-18",   "Jun-18",   "Jul-18",   "Aug-18",   "Sep-18",   "Oct-18",   "Nov-18",   "Dec-18",   "Jan-19",   "Feb-19",   "Mar-19",   "Apr-19")

ceii <- c(0.108,    -0.012, 0.134,  0.131,  -0.030, 0.072,  -0.062, 0.100,  -0.089, 0.149,  -0.070, -0.047, 0.043,  -0.019, -0.012, -0.020)

请帮助组合图例。提前致谢。

【问题讨论】:

  • 请提供样本数据来重现你的情节,如stackoverflow.com/questions/5963269/…所示
  • 我最好的猜测是,您应该确保您的linedata 中有一个名为variable 的列,其中只有一个值"CEII"。然后你可以将variable映射到line geom中的color和bar geom中的fill。确保在scale_*manual() 函数中使用相同的name,否则组合的图例将被分开。
  • 我试过了,名字一样,但传说还是分开了。能否请您告诉我确切的命令或修改我的命令。
  • 请找到使用的数据集。 @DavidJorquera
  • @aosmith 请帮忙。

标签: r ggplot2


【解决方案1】:

一种选择是使两个因素的水平相同。这需要对 data.frames 进行一些前期工作。

例如,执行此操作的一种方法是,将名为 variable 的变量添加到 linedata,然后匹配因子水平。

melteddata = reshape2::melt(alldata, id.vars = "x")

# Add CEII to levels of "variable"
melteddata$variable = factor(melteddata$variable, 
                             levels = c(levels(melteddata$variable), "CEII") )


linedata = data.frame(x, ceii, variable = "CEII")

# Same levels in linedata as melteddata
linedata$variable = factor(linedata$variable, 
                           levels = levels(melteddata$variable) )

然后我为绘图之外的颜色制作了一个矢量,以便它可以用于颜色和填充。我将其设为命名向量,因为我发现这是最好的做法,以防顺序发生变化。

# Vector of colors
fillcol = c("#0000FF", "#FFC0CB", "#00FFFF", "#00FF00", "#FF00FF", "#20B2AA", "#000000")
names(fillcol) = levels(melteddata$variable)

然后,如果您在比例层中使用drop = FALSE,您将获得一个组合图例。

要在guide_legend() 中获得填充框以及您需要override.aes 的行的行框。我从最后一个框中删除了填充,以便显示该行。

请注意,我没有您的 ordered_x 变量,因此这可能不是您正在寻找的情节。

ggplot(melteddata) +  
    geom_col(aes(x = x, y = value, fill = variable) ) +
    geom_line(data = linedata, aes(x = x, y = ceii, 
                                   color = variable,
                                   group = 1), lwd = 1.5) + 
    scale_color_manual(name = "Components", drop = FALSE,
                         values = fillcol ) + 
    scale_fill_manual(name = "Components", drop = FALSE,
                      values = fillcol ) +
    guides(fill = guide_legend(override.aes = list(fill = c(fillcol[1:6], NA) ) ) )

【讨论】:

  • 非常感谢!它工作得很好。但我只是有一个小小的概念疑问,当我得到图表时,绘制的数据点并没有显示实际的数据点。例如 - 说空运货物的数据点是 -0.02 ,但是当所有其他都是正值时,它在条形图中显示的值大于 -0.05。我什至在上面添加了我的图表图片。@aosmith
  • @AyushiJain 您能否将此问题标记为已解决(如果已解决),然后提出一个新问题?我不认为我在我制作的情节中看到了问题,这让我想知道当你设置 breaks/labels 时是否发生了什么事情。在一个新问题中尝试做一个非常小的例子,可能只包括显示问题的月份。这将帮助人们帮助你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2011-01-20
相关资源
最近更新 更多