ggplot2:将一行放在前面,但保存颜色

Posted

技术标签:

【中文标题】ggplot2:将一行放在前面,但保存颜色【英文标题】:ggplot2: Bring one line to the front, but save the colors 【发布时间】:2014-02-02 21:34:17 【问题描述】:

考虑以下代码:

library(ggplot2)
foo <- data.frame(x=1:10,A=1:10,B=10:1)
ggplot(melt(foo,id.vars="x"),aes(x,value,color=variable))+geom_line(size=5)

我想把红线 (A) 放在前面,在 B 的顶部(见交叉点),而它们在图例中出现的颜色和顺序不会改变。有什么办法吗?

【问题讨论】:

【参考方案1】:

使用子集数据框重新绘制红线就可以了。

library(ggplot2)
foo <- data.frame(x=1:10,A=1:10,B=10:1)
require(reshape2)
fooM <- melt(foo,id.vars="x")
p<-ggplot()
p<-p+geom_line(data=fooM[fooM$variable!="A",],aes(x,value,color=variable),size=5)
p<-p+geom_line(data=fooM[fooM$variable=="A",],aes(x,value,color=variable),size=5)
p

编辑: 请注意,ggplot 将层按顺序叠加在一起 ​​- 在逐行构建绘图时可以最好地利用这一点。

编辑2: @tonytonov 是对的,人们可能希望避免两次绘制相同的东西。修改了我的答案,第一次绘制除 A 之外的所有内容,然后只绘制 A。结果保持不变,现在也与透明度或大数据兼容;)

【讨论】:

【参考方案2】:

除非您有理由避免,否则重新绘制的解决方案很好。我至少能想到两个:使用 alpha(透明度)或性能问题(你需要一次性完成,大数据)。

这是我的建议:

require(scales)
# give the desired order here, I just use reverse
# separate function since we apply it over both levels & colors
shuffle <- function(x) rev(x)
foo <- data.frame(x=1:10, A=1:10, B=10:1, C=2.5, D=7.5)
melt_foo <- melt(foo, id.vars="x") 
# original plot
ggplot(melt_foo, aes(x, value, color=variable)) + 
  geom_line(size=5)

orig_order <- levels(melt_foo$variable)
new_order <- shuffle(orig_order)
# grabbing default colours
orig_colors <- hue_pal()(length(new_order))
new_colors <- shuffle(orig_colors)
melt_foo$variable <- factor(melt_foo$variable, levels=new_order)
# levels _and_ colours reversed, legend appearance stays the same
ggplot(melt_foo, aes(x, value, color=variable)) + 
  geom_line(size=5) + 
  scale_colour_manual(values=new_colors, labels=orig_order, breaks=orig_order) 

【讨论】:

【参考方案3】:

试试这个,

last_plot() + aes(group=rev(variable))

【讨论】:

天哪。我知道这比我想象的要容易,但这是一个致命的单线! 真正优雅的解决方案。但是您不能为超过两行指定自定义排序,对吗? 为什么不呢?在我的示例中工作正常,有四个级别。 对我没有任何改变。我在ggplot() 中有color = Var,然后尝试last_plot() + aes(group=rev(Var))。没有错误,打印正常,但打印顺序保持不变。我错过了什么?【参考方案4】:

data.frame(x=1:10,A=1:10,B=10:1) 中的A,B 的顺序会导致此分层问题,因为它首先绘制 A (1:10)。

如果您使用data.frame(x=1:10,A=10:1,B=1:10),则将升序线放在顶部(因为最后绘制了B)。

【讨论】:

以上是关于ggplot2:将一行放在前面,但保存颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何将文本文件的第一行放在结束位置

R - ggplot2 Legend没有出现在折线图上[重复]

ggplot2:逻辑回归 - 绘制概率和回归线

如何在ggplot2中使用多色拟合线将颜色分配给多色散点图

ggplot2:将颜色固定到因子水平

R ggplot2 颜色映射与 geom_hline