我正在尝试在ggplot中绘制一个数据框,并且无法按要求的顺序显示点和线。
数据基于相同的列(因子0或1)进行拆分,我希望0对于线和点(使用来自4个其他单独列的数据)绘制超过1的值。
我在下面做了一个测试数据框来说明我的观点。我的真实数据帧有数千个点,我想绘制一些数据帧,所以不要真正想要使用一种解决方法,例如将数据子集化并绘制为单独的图层/ geoms。
testdata <- data.frame(Split = c(rep(0,5), rep(1,5)), a = rep(1:5,2),
b = c(7,8,9,10,11,6,8,9,10,12), x = c(1:5, 1:5), y = c(1:3,5,6,1.1,2.1,4.1,5.1,7.1))
testdata$Split <- factor(testdata$Split)
ggplot(data = testdata)+
geom_point(aes(x = x, y = y, colour = Split), size = 4)+
geom_line(aes(x = a, y = b, colour = Split))
testdata$Split <- ordered(testdata$Split, levels = rev(levels(testdata$Split)))
当我运行代码行以反转我的关卡的顺序时,它会将我的哪些线条交换到前面,而不是哪一组点。因此,最初两个与Split = 0相关的点和线都落后了,但是当我颠倒顺序时,Split = 0的线是前面的(我想要的)但是Split = 0的点仍然在Split = 1的点后面。
任何想法在这里发生了什么,以及我如何让它工作将不胜感激。
由于
答案 0 :(得分:0)
经过一段时间的调查,这是我发现和建议的。简而言之,我认为解决方案是在unclass()
中将值2分配给0。
foo <- data.frame(split = rep(c("0", "1"), each = 5),
a = rep(1:5,2),
b = c(7,8,9,10,11,6,8,9,10,12),
x = c(1:5, 1:5),
y = c(1:3,5,6,1.1,2.1,4.1,5.1,7.1),
stringsAsFactors=F)
为了在分割中将unclass()
中的2分配给0,我执行了以下操作。
foo <- arrange(foo, desc(split))
foo$split <- as.factor(foo$split)
#> str(foo)
#'data.frame': 10 obs. of 5 variables:
# $ split: Factor w/ 2 levels "0","1": 2 2 2 2 2 1 1 1 1 1
# $ a : int 1 2 3 4 5 1 2 3 4 5
# $ b : num 6 8 9 10 12 7 8 9 10 11
# $ x : int 1 2 3 4 5 1 2 3 4 5
# $ y : num 1.1 2.1 4.1 5.1 7.1 1 2 3 5 6
再一次,0在unclass()
中有2个。
#> unclass(foo$split)
# [1] 2 2 2 2 2 1 1 1 1 1
#attr(,"levels")
#[1] "0" "1"
现在我运行以下内容。 q(对于积分)具有理想的结果。但是q2(对于线条)没有。
q <- ggplot(data = foo, aes(x = x, y = y, colour = split))+
geom_point(size = 6)
q2 <- ggplot(data = foo, aes(x = a, y = b, colour = split))+
geom_line()
所以,我颠倒了因子顺序,看看会发生什么。
### Reorder the factor levels.
foo$split <- ordered(foo$split, rev(levels(foo$split)))
#> str(foo)
#'data.frame': 10 obs. of 5 variables:
#$ split: Ord.factor w/ 2 levels "1"<"0": 1 1 1 1 1 2 2 2 2 2
#$ a : int 1 2 3 4 5 1 2 3 4 5
#$ b : num 6 8 9 10 12 7 8 9 10 11
#$ x : int 1 2 3 4 5 1 2 3 4 5
#$ y : num 1.1 2.1 4.1 5.1 7.1 1 2 3 5 6
#> unclass(foo$split)
#[1] 1 1 1 1 1 2 2 2 2 2
#attr(,"levels")
#[1] "1" "0"
q3和q4都得到了正确的结果。
q3 <- ggplot(data = foo, aes(x = x, y = y, colour = split))+
geom_point(size = 6)
q4 <- ggplot(data = foo, aes(x = a, y = b, colour = split))+
geom_line()
所以,这是最终形式。
ggplot(data = foo)+
geom_point(aes(x = x, y = y, colour = split), size = 6)+
geom_line(aes(x = a, y = b, colour = split))