如何使用数字数据订购ggplot图表的图例?

时间:2017-11-06 15:37:53

标签: r ggplot2

尝试用ggplot2制作情节我很难按照自己的意愿订购传奇。为了调试我做了一些示例数据,虽然数据和代码相似,但不会出现问题!我对以ggplot对其数据进行排序的方式感到困惑。

图例应按其值排序,因为它是数字,因为它实际上是在示例数据中,而不是在我的工作数据中。

这是我的数据......

structure(list(n = c(150000, 15000, 3000, 1500, 750), estimate = c(0.0485706666666667, 
0.0454933333333333, 0.0604, 0.0413333333333334, 0.0402666666666666
), se = c(0.00230392190029327, 0.00727258789388646, 0.0163963824219692, 
0.0229426160506936, 0.0324210840623078), t.value = c(21.0811338041398, 
6.25147550973637, 3.67790396107066, 1.80003749831851, 1.23787262678884
)), .Names = c("n", "estimate", "se", "t.value"), row.names = c("150000", 
"15000", "3000", "1500", "750"), class = "data.frame")

...以及我用来制作df的代码

# allEst <- data.frame(rbind(est1, est2, est3, est4, est5))  
# names(allEst) <- names(est1.tmp)
# rownames(allEst) <- c(150000, 15000, 3000, 1500, 750)

情节代码

# confidence intervals
interval1 <- - qnorm((1 - .95) / 2)  # 5% 
interval2 <- - qnorm((1 - .99) / 2)  # 1% 

# Plot
library(ggplot2)
ep <- ggplot(allEst, aes(colour=rownames(allEst)))
ep <- ep + geom_hline(yintercept=0.05, colour=gray(1/2), lty=2)
ep <- ep + geom_linerange(aes(x=n,
                                ymin=estimate - se*interval1, 
                                ymax=estimate + se*interval1),
                            lwd=2)
ep <- ep + geom_pointrange(aes(x=n, y=estimate, 
                                 ymin=estimate - se*interval2, 
                                 ymax=estimate + se*interval2),
                             lwd=1, shape=21, fill="WHITE")
ep <- ep + scale_x_log10()
ep <- ep + coord_flip() 

print(ep)

这给了我:

enter image description here

这里是我创建的玩具示例:

est1 <- c(1e5, 0.0485, 0.0023, 21.08)
est2 <- c(1e4, 0.0454, 0.0072, 6.25)
est3 <- c(1e3, 0.0604, 0.0163, 3.67)
est4 <- c(1e2, 0.0402, 0.0324, 1.23)

df <- data.frame(rbind(est1, est2, est3, est4))
rownames(df) <- c(100000, 10000, 1000, 100)
df

interval1 <- - qnorm(0.025); interval2 <- - qnorm(0.005)

library(ggplot2)
ep1 <- ggplot(df, aes(colour=rownames(df)))
ep1 <- ep1 + geom_hline(yintercept=0.05, colour=gray(1/2), lty=2)
ep1 <- ep1 + geom_linerange(aes(x=X1, ymin= X2 -  X3*interval1,
                                ymax= X2 +  X3*interval1),
                            lwd=2, position=position_dodge(width=1/2))
ep1 <- ep1 + geom_pointrange(aes(x=X1, y= X2, ymin= X2 - 
                                    X3*interval2, ymax= X2 + 
                                    X3*interval2),
                             lwd=1, position=position_dodge(width=1/2),
                             shape=21, fill="WHITE")
ep1 <- ep1 + scale_x_log10()
ep1 <- ep1 + coord_flip() 

print(ep1)

...并且情节完全有序(!)图例:

enter image description here

那么,发生了什么?我在哪里失明?

2 个答案:

答案 0 :(得分:2)

使用breaks中的scale_color_discrete重新排序颜色图例:

# Adding sorted rownames to breaks
ep + scale_color_discrete(breaks = sort(as.numeric(rownames(allEst))))

结果图:

enter image description here

答案 1 :(得分:2)

你将一个角色向量从rownames(allEst)传递给美学,这些美学被分类为一个角色:

sort(rownames(allEst))
[1] "1500"   "15000"  "150000" "3000"   "750" 

如果字符使用sort,则使用字母排序,其中'1''12''2'之前,'a''ab''ba'之前。如果你看一下

之间的区别
sort(c(1:3, 10, 20, 30)) 

返回

[1] 1 2 3 10 20 30 

sort(as.character(c(1:3, 10, 20, 30))) 

返回

1&#34; 1&#34; &#34; 10&#34; &#34; 2&#34; &#34; 20&#34; &#34; 3&#34; &#34; 30&#34;

可能更清楚。

改变它的一种方法是使用factor(sort(as.numeric(rownames(allEst))))。集成在您的代码中:

library(ggplot2)
ep <- ggplot(allEst, aes(colour=factor(sort(as.numeric(rownames(allEst))))))
ep <- ep + geom_hline(yintercept=0.05, colour=gray(1/2), lty=2)
ep <- ep + geom_linerange(aes(x=n,
                              ymin=estimate - se*interval1, 
                              ymax=estimate + se*interval1),
                          lwd=2)
ep <- ep + geom_pointrange(aes(x=n, y=estimate, 
                               ymin=estimate - se*interval2, 
                               ymax=estimate + se*interval2),
                           lwd=1, shape=21, fill="WHITE")
ep <- ep + scale_x_log10()
ep <- ep + coord_flip() 

print(ep)

返回: output_ggplot