如何使用已计算的值绘制ggplot2图上的95百分位数和5百分位数?

时间:2014-04-03 07:03:48

标签: r ggplot2 percentile

我有this数据集并使用此R代码:

library(reshape2)
library(ggplot2)
library(RGraphics)
library(gridExtra)

long <- read.csv("long.csv")
ix <- 1:14

ggp2 <- ggplot(long, aes(x = id, y = value, fill = type)) +
    geom_bar(stat = "identity", position = "dodge") +
    geom_text(aes(label = numbers), vjust=-0.5, position = position_dodge(0.9), size = 3, angle = 0) +
    scale_x_continuous("Nodes", breaks = ix) +
    scale_y_continuous("Throughput (Mbps)", limits = c(0,1060)) +
    scale_fill_discrete(name="Legend",
                        labels=c("Inside Firewall (Dest)",
                                 "Inside Firewall (Source)",
                                 "Outside Firewall (Dest)",
                                 "Outside Firewall (Source)")) +
    theme_bw() +
    theme(legend.position="right") +
    theme(legend.title = element_text(colour="black", size=14, face="bold")) +
    theme(legend.text = element_text(colour="black", size=12, face="bold")) +
    facet_grid(type ~ .) +
plot(ggp2)

获得以下结果: enter image description here

现在我需要在情节中添加95百分位数和5百分位数。数字在this数据集(NFPnumbers(95百分位数)和FPnumbers(5百分位数)列)中计算。

似乎boxplot()可能在这里工作,但我不确定如何在ggplot中使用它。 stat_quantile(quantiles = c(0.05,0.95))也可以正常工作,但函数会自行计算数字。我可以在这里使用我的号码吗?

我也尝试过:

geom_line(aes(x = id, y = long$FPnumbers)) +
geom_line(aes(x = id, y = long$NFPnumbers))

但结果看起来不够好。

geom_boxplot()效果不佳:

geom_boxplot(aes(x = id, y = long$FPnumbers)) +
geom_boxplot(aes(x = id, y = long$NFPnumbers))

2 个答案:

答案 0 :(得分:2)

有几个合适的geom,geom_errorbar就是其中之一:

ggp2 + geom_errorbar(aes(ymax = NFPnumbers, ymin = FPnumbers), alpha = 0.5, width = 0.5)

enter image description here

我不知道是否有办法摆脱中心线。

答案 1 :(得分:1)

如果要为箱线图设置参数,还需要yminymax值。由于它们不在数据集中,我计算了它们。

ggplot(long, aes(x = factor(id), y = value, fill = type)) +
  geom_boxplot(aes(lower = FPnumbers, middle = value, upper = NFPnumbers, ymin = FPnumbers*0.5, ymax = NFPnumbers*1.2, fill = type), stat = "identity") +
  xlab("Nodes") +
  ylab("Throughput (Mbps)") +
  scale_fill_discrete(name="Legend",
                      labels=c("Inside Firewall (Dest)", "Inside Firewall (Source)",
                               "Outside Firewall (Dest)", "Outside Firewall (Source)")) +
  theme_bw() +
  theme(legend.position="right",
        legend.title = element_text(colour="black", size=14, face="bold"),
        legend.text = element_text(colour="black", size=12, face="bold")) +
  facet_grid(type ~ .)

结果:

enter image description here


在您提供的数据集中,您提供了valueFPnumbers&amp; NFPnumbers个变量。作为FPnumbers&amp; NFPnumbers代表5和95百分位,我想平均值由value表示。要使此解决方案有效,您需要为每个&#34; Node&#34;提供minmax值。我想你的原始数据中有它们。

但是,由于数据集中未提供这些内容,因此我根据FPnumbers&amp; NFPnumbers0.51.2的乘法因子是任意的。这只是创建虚构的minmax值的一种方式。