【问题标题】:Properly ordered factor in ggplot is not working with fill_color_manualggplot 中正确排序的因子不适用于 fill_color_manual
【发布时间】:2017-07-20 11:17:19
【问题描述】:

我正在尝试使用 stat_contour 和 geom_tile 的组合来绘制填充等高线图。发生了一件奇怪的事情,尽管检查了因子水平和颜色向量,但颜色有时与正确的水平不对应。

示例 1:颜色匹配正确

休息:

 [1] "[1.2e-06,1.25e-06]" "(1.25e-06,1.3e-06]"
 [3] "(1.3e-06,1.35e-06]" "(1.35e-06,1.4e-06]"
 [5] "(1.4e-06,1.45e-06]" "(1.45e-06,1.5e-06]"
 [7] "(1.5e-06,1.55e-06]" "(1.55e-06,1.6e-06]"
 [9] "(1.6e-06,1.65e-06]" "(1.65e-06,1.7e-06]"

颜色:

 [1] "#FFFF00" "#8DFF00" "#1CFF00" "#00AA54"
 [5] "#0038C6" "#2307FB" "#6A15F5" "#AA1CD5"
 [9] "#D40E6A" "#FF0000"

结果:

示例 2:颜色不匹配(第一个 bin 是最后一个颜色!)

休息:

 [1] "[100,110]" "(110,120]" "(120,130]"
 [4] "(130,140]" "(140,150]" "(150,160]"
 [7] "(160,170]" "(170,180]" "(180,190]"
[10] "(190,200]" "(200,210]"

颜色:

 [1] "#FFFF00" "#99FF00" "#32FF00" "#00CB33"
 [5] "#006599" "#0000FF" "#400CF9" "#8019F3"
 [9] "#B319BF" "#D90C5F" "#FF0000"

结果:

如您所见,在这两种情况下,第一个分箱范围都应该对应于黄色,但在第二种情况下,填充的颜色是红色!

我已经附加了函数at this pastebin link,但这里是相关的sn-p:

            geom_tile(data=longdata_n,aes(x=lons[longdata_n[,1]],
                     y=lats[longdata_n[,2]],fill=brks),alpha=0.5) +
            geom_tile(data=longdata_s,aes(x=lons[longdata_s[,1]],
                     y=lats[longdata_s[,2]],fill=brks),alpha=0.5) +
    scale_fill_manual(breaks=lev_order,values=contour_cols) +

编辑以添加其他信息:

我怀疑这与在scale_color_manual 中如何解释因素的顺序有关,因为当我将行更改为

scale_fill_manual(values=contour_cols) 没有指定中断,这就是它的样子:

请注意,虽然配色方案保持不变,但第一个因素级别现在位于底部。有没有办法解决这个问题?

【问题讨论】:

  • 您可以在绘图之前设置数据集中因子水平的顺序,也可以使用中断向量设置颜色向量的名称。例如,请参阅 here 以获取后者的示例。
  • 哇哦!将名称添加到颜色矢量就可以了!!!!
  • 命名颜色向量通常是最安全的方法,但真正的问题在于如何将原始数据集一分为二进行绘图。由于每个子集都有不同的“中断”值,因此 ggplot2 必须将变量转换为字符以组合值,然后再次考虑因子。如果它们是字符变量,请查看像您这样的变量的因子级别顺序:levels(factor(c("[100,110]","(110,120]", "(200,210]")))levels(factor(c("(90,100]","(100,110]", "(200,210]")))
  • 为避免在每个子集中删除未使用的因子级别以及随后的重构,请在 scale_fill_manual 中使用 drop = FALSE 而不是默认的 drop = TRUE

标签: r ggplot2


【解决方案1】:

感谢 aosmith 的提示!

将名称添加到颜色轮廓会导致它们正确对应,即使如果我没有在scale_fill_manual 中指定breaks= 参数,由于某种原因顺序仍然混乱。我这样做是为了解决订购问题:

lev_order<-levels(as.factor(longdata$breaks))
contour_cols<-colorRampPalette(c("yellow","green","blue","purple","red"))(length(lev_order))
names(contour_cols) <- lev_order

其他一切正常!现在看起来应该是这样的:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    相关资源
    最近更新 更多