2013-04-04 99 views
1

我想根据方向更改箭头的颜色。我想出了将箭头插入情节,但目前他们都是黑色的。我想从左到右以绿色显示箭头,从右到左以箭头显示红色箭头。那可能吗?根据ggplot中的方向绘制带两种不同颜色的箭头

这里是我的“短”代码:

library(ggplot2) 

name = c("Name1","Name2", "Name1", "Name2") 
time = c("1", "3","4","2") 
value = c(5.1, 4.8, 4.1, 6.3) 
data <- data.frame(name, time, value) 

p <- ggplot(data, aes(x=value, y=name)) + 
    geom_point(aes(colour=time), shape=16, size=6) + 
    geom_path(aes(group=name), arrow=arrow(length=unit(0.15,"cm")), colour="black", size=1) 
print(p) 

预先感谢您的任何帮助,您可以提供!

回答

1

看起来n可以用作箭头方向的代理,所以:

p + geom_path(aes(group=n), arrow=arrow(length=unit(0.15,"cm")), colour=c("red","green")[factor(n)], size=1) 

然而,更普遍的,我想你会想是这样的:

p + geom_path(aes(group=n), arrow=arrow(length=unit(0.15,"cm")), colour=c("red","black","green")[(sign(tapply(v,n,diff))+2)[n]], size=1) 

v意味着用作因数而不是数值?

+0

谢谢!如果我正确理解代码,我必须将每个n映射到一种颜色。我认为有可能使用有关箭头方向的信息?因为我的数据集的长度是可变的。 – arrado 2013-04-04 16:48:13

+0

映射使用数据中的信息来确定方向,但在第二个示例中更是如此。 – James 2013-04-04 16:52:31

+0

v是一个数字值。我修正了这个例子。谢谢你的第二个例子。我收到一个错误“错误:设置美学的不兼容的长度:颜色,大小”。我想我知道'tapply'是什么意思,但我无法弄清楚为什么会出现错误。 – arrado 2013-04-04 17:25:27

1

您可以向我命名为direction的数据添加新列。它使用来自库plyr的函数ddply针对name的每个级别进行计算。 direction变量可以具有两个值TRUEFALSE,具体取决于特定name级别(正数或负数)的第一个和第二个value值之间的差异。

library(plyr) 
data<-ddply(data,.(name),transform,direction=((value[1]-value[2])>0)) 
data 
    name time value direction 
1 Name1 1 5.1  TRUE 
2 Name1 4 4.1  TRUE 
3 Name2 3 4.8  FALSE 
4 Name2 2 6.3  FALSE 

使用此新变量设置颜色为geom_path()

ggplot(data, aes(x=value, y=name)) + 
    geom_point(aes(colour=time), shape=16, size=6) + 
    geom_path(aes(group=name), arrow=arrow(length=unit(0.15,"cm")), size=1,color=c("red","blue")[factor(data$direction)]) 
+0

谢谢你的代码!我还有一个额外的专栏,提供我脑海中的信息。但认为必须有一种方法来使用已经在情节中的信息。在这里使用ddply的解决方案是一个好主意。谢谢! – arrado 2013-04-05 08:19:13

相关问题