尝试用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)
这给了我:
这里是我创建的玩具示例:
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)
...并且情节完全有序(!)图例:
那么,发生了什么?我在哪里失明?
答案 0 :(得分:2)
使用breaks
中的scale_color_discrete
重新排序颜色图例:
# Adding sorted rownames to breaks
ep + scale_color_discrete(breaks = sort(as.numeric(rownames(allEst))))
结果图:
答案 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)