【发布时间】: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。