手动设置多层图的图例颜色和文本

时间:2018-05-05 11:57:14

标签: r ggplot2

过去两年我一直在使用r开关,而且最近才开始使用ggplot来构建图形。我陷入了下面描述的情况:

我有一个多层图,其中所有数据都在初始ggplot调用中引用的相同数据框中。

  • 第1层=积分
  • 第2层=平均趋势
  • 第3层=趋势的衍生物
  • 第4层和第5层=给出平均趋势的点的预测间隔

我想要做的是手动调整图例文本以反映每个图层的名称和颜色/ geom(layer4& 5可以是一个参考)。当我这样做时,geom_lines的图例都会变回红色。

另一个问题是我想重命名渐变比例,但是当我这样做时,渐变变成离散点而不是条形。

ggplot(D_ff_NWn,aes(NW_norm,FF_Det,color = CYC))+
  geom_point()+
  scale_color_gradient(guide = guide_legend(title = "Feeder Cycle"))+
  geom_line(aes(NW_norm,FF10.fit,fill="black"), color="black", show.legend = TRUE) +
  geom_line(aes(NW_norm,Diff1*SCL_rg+SCL_FF[1],fill="red"), 
            color="red", show.legend = TRUE)+
  geom_line(aes(NW_norm,FF_UCL,fill="Prediction"),color="green")+
  geom_line(aes(NW_norm,FF_LCL),color="green")+
  labs(x = "Normalized Net Weight (%)")+
  scale_y_continuous("Feed Factor (g/rev)", 
                     sec.axis = sec_axis(~ (. - SCL_FF[1])/SCL_rg, 
                                         name = "1st Derivative ([g/rev]/%)"))+
  scale_fill_manual(name="",
                    labels = c("Avg FF (g/min)", "1st Derivative","95% Prediction"),
                    values = c("black","red","green"))+ 
  theme(axis.text.y.right = element_text(color = "red"), 
        axis.title.y.right = element_text(color = "red"))

总而言之,我希望有:

  1. 我的自定义名称的渐变栏获得了第一层
  2. 具有自定义名称的每个图层的代表性行
  3. Example graph

    注意:使用SCL_FFSCL_rg

    缩放第二个y轴

    我确信无法添加足够的数据来生成上面显示的图像,但数据框结构如下所示。

     'data.frame':  16141 obs. of  19 variables:
     $ key                : Factor w/ 6 levels "ATAB","CCNa",..: 1 1 1 1 1 1 1 1 
     1 1 ...
     $ Process_Time       : num  5.65 5.67 5.68 5.7 5.72 ...
     $ CONC_PCT           : num  32 32 31.8 31.7 31.6 ...
     $ STATE              : Factor w/ 4 levels "Blind","Gravimetric",..: 2 2 2 2 
     2 2 2 2 2 2 ...
     $ NW                 : num  1.16 1.15 1.15 1.15 1.15 ...
     $ SRW_SP             : num  56.7 56.4 56.3 56.2 56 ...
     $ FF                 : num  2.36 2.37 2.37 2.37 2.37 ...
     $ MF                 : num  8 7.98 7.95 7.93 7.9 ...
     $ CYC                : int  1 1 1 1 1 1 1 1 1 1 ...
     $ Max_Mass           : num  1.72 1.72 1.72 1.72 1.72 ...
     $ NW_norm            : num  0.673 0.672 0.671 0.67 0.668 ...
     $ FF_Det             : num  2.33 2.33 2.33 2.34 2.34 ...
     $ FF10.fit           : num  2.34 2.34 2.34 2.34 2.34 ...
     $ FF10.se.fit        : num  0.000121 0.000121 0.000121 0.000121 0.000121 
     ...
     $ FF10.residual.scale: num  0.00458 0.00458 0.00458 0.00458 0.00458 ...
     $ FF10.df            : num  16128 16128 16128 16128 16128 ...
     $ Diff1              : num  0.0363 0.0363 0.0361 0.0344 0.0323 ...
     $ FF_UCL             : num  2.35 2.35 2.35 2.35 2.35 ...
     $ FF_LCL             : num  2.34 2.34 2.34 2.34 2.34 ...
    

    有什么我公然缺席的吗?我认为我对ggplot图层的工作原理有了一个很好的理解。

    感谢任何帮助或指导。

    更新07May2018

    Z.Lin下面描述的解决方案奏效了。我颠倒了渐变条标签,并将“一阶导数”图层更改为指向隐藏“标准化净重”高端的不需要的栅格。

    1. 新图例会生成所有图层的点/线。可以调整吗我不明白为什么它必须默认为这个
    2. 另一个问题是使用形状的边框会从渐变条映射中减去主图。这可能没问题,因为主图是窗口中饲料因子的去趋势版本,相对于“标准化净重”而不是“处理时间”而绘制
    3. Updated Plot

      enter image description here

      ggplot(D_ff_NWn, aes(x = NW_norm))+
      
        geom_point(aes(y = FF_Det, fill = CYC), shape = 21,stroke = 0.1) +
        geom_point(aes(y = Diff1 * SCL_rg + SCL_FF[1], colour = "1st 
          Derivative"),size=0.5) +
        geom_line(aes(y = FF10.fit, colour = "Avg FF (g/min)")) +
        geom_line(aes(y = FF_UCL, colour = "95% Prediction")) +
        geom_line(aes(y = FF_LCL, colour = "95% Prediction")) +
      
        labs(x = "Normalized Net Weight (%)")+
        scale_y_continuous(name = "Feed Factor (g/rev)", 
                           sec.axis = sec_axis(~ (. - SCL_FF[1])/SCL_rg, 
                                               name = "1st Derivative ([g/rev]/%)")) +
        scale_fill_gradient(name = "Feeder Cycle",guide = guide_colourbar(reverse = 
                                                                            TRUE))+
        scale_colour_manual(name = "",
                            values = c("Avg FF (g/min)" = "black", 
                                       "1st Derivative" = "red",
                                       "95% Prediction" = "green"))+ 
      
        theme(axis.text.y.right = element_text(color = "red"), 
              axis.title.y.right = element_text(color = "red"))
      

1 个答案:

答案 0 :(得分:0)

如果没有实际数据进行测试,这是我对可以为您工作的最佳猜测:

ggplot(D_ff_NWn, 
       aes(x = NW_norm))+

  geom_point(aes(y = FF_Det, fill = CYC), shape = 21, colour = alpha("black", 0)) +
  geom_line(aes(y = FF10.fit, colour = "Avg FF (g/min)")) +
  geom_line(aes(y = Diff1 * SCL_rg + SCL_FF[1], colour = "1st Derivative")) +
  geom_line(aes(y = FF_UCL, colour = "95% Prediction")) +
  geom_line(aes(y = FF_LCL, colour = "95% Prediction")) +

  labs(x = "Normalized Net Weight (%)")+
  scale_y_continuous(name = "Feed Factor (g/rev)", 
                     sec.axis = sec_axis(~ (. - SCL_FF[1])/SCL_rg, 
                                         name = "1st Derivative ([g/rev]/%)")) +
  scale_fill_gradient(name = "Feeder Cycle")+
  scale_colour_manual(name = "",
                      values = c("Avg FF (g/min)" = "black", 
                                 "1st Derivative" = "red",
                                 "95% Prediction" = "green")) + 

  theme(axis.text.y.right = element_text(color = "red"), 
        axis.title.y.right = element_text(color = "red"))

如果这样可行,我在您的代码中观察到的几个问题的解释如下:

问题1 - 您想为geom_point()&指定不同的颜色图例。 geom_line()图层

如果您选中?geom_line,则可以看到colour列在其理解的美学中,但fill不是。fill = red。这意味着geom_line(aes(...))中的geom_point(或其他颜色)行将被忽略。

另一方面,colour同时理解fillcolour。默认的点形状基于fill美学而着色,但还有其他形状根据colour美学着色,其轮廓基于fill美学。

shapes

(图片来自here。形状21-25接受colour的颜色,& geom_point的轮廓。)

要解决问题1,请选择21-25中的形状,使用aes(fill = CYC)设置aes(colour = something)的颜色,然后将[{1}}保留为各自的geom_line图层。< / p>

问题2 - 手动声明的图例标签的顺序可能不正确

我知道您使用aes(fill = "some value")scale_fill_manual()这样的内容可以手动指定审美映射,但代码中值的顺序为:

  • aes(fill = "black")(第2层)
  • aes(fill = "red")(第3层)
  • aes(fill = "Prediction")(第4层)

而手动秤中的订单是:

scale_fill_manual(name="", 
                  labels = c("Avg FF (g/min)", "1st Derivative","95% Prediction"),
                  values = c("black","red","green")) 

暂时忽略colourfill问题,我们可以看到此处列出的值的字母顺序为c("black", "Prediction", "red")scale_fill_manual()无法知道Prediction应该映射到green;它只是按字母顺序排列值,&amp;将它们按顺序匹配到此处列出的标签/值。

要解决问题2,请在values中为scale_XXX_manual参数使用命名向量。

(我还建议将标签用作各种geom_line(aes(fill = "some value"))图层中的值,并将labels = c(...)中的scale_XXX_manual全部删除。我认为这样更整洁。)

问题3 - 您明确要求离散点中的颜色图例,而不是颜色条

ggplot2guide_legendguide_colourbar中有两个不同的与图例相关的功能。前者创造了一个离散的尺度,而后者则是一个连续的尺度。默认情况下,scale_XXX_gradient实际上使用了colourbar选项,但行scale_color_gradient(guide = guide_legend(title = "Feeder Cycle"))覆盖了该行。

要解决问题3,您可以:

  • guide_legend(title = "some title")替换为guide_colourbar(title = "some title")或;
  • 只需将它们全部放在一起,并使用scale_XXX_gradient(name = "some title")指定图例名称。

(次要)第4期 - 顶级美学映射

在您的代码中,每个geom图层的美学映射都以NW_norm的{​​{1}}开头,后跟x的不同变量。

由于y对所有图层都是通用的,因此应在顶级x = NW_norm调用中声明,并且。除非有一个本地ggplot()映射来覆盖它,否则所有后续层都将继承该层。

由于每个图层的aes(x = some.other.variable)不同,因此不需要它在顶层调用中。每个y = something图层都应具有自己的geom美学映射,将明确命名为y,而不是aes(y = something, ...)