【问题标题】:How to plot 95 percentile and 5 percentile on ggplot2 plot with already calculated values?如何使用已经计算的值在 ggplot2 图上绘制 95 个百分位和 5 个百分位?
【发布时间】:2014-05-14 20:12:47
【问题描述】:

我有 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)

得到以下结果:

现在我需要将 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))

【问题讨论】:

  • 附带问题:颜色为情节带来了哪些额外信息?
  • 当我从 ggplot 中删除 facet_grid(type ~ .) 时,颜色有助于将条与“图例”链接起来。
  • 另一种选择是更改因子水平,图例将变得过时。只是大声思考......

标签: r ggplot2 percentile


【解决方案1】:

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

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

我不知道有没有办法摆脱中线。

【讨论】:

    【解决方案2】:

    当您要设置箱线图的参数时,您还需要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 ~ .)
    

    结果:


    在您提供的数据集中,您提供了valueFPnumbersNFPnumbers 变量。由于FPnumbers & NFPnumbers 代表 5 和 95 个百分位数,我想平均值由 value 表示。要使此解决方案起作用,您将需要每个“节点”的 minmax 值。我猜你的原始数据中有它们。

    但是,由于数据集中没有提供它们,因此我通过基于 FPnumbersNFPnumbers 计算它们来弥补它们。 0.51.2 的乘法因子是任意的。这只是一种创建虚构的minmax 值的方法。

    【讨论】:

    • 为什么柱子上移了?是因为条形的彩色部分代表 5% 到 95% 之间的值吗?水平线呢?谢谢。
    • 是的,条形的彩色部分代表 5 到 95 个百分位数之间的值。方框内的水平线是中间值(即来自变量 value 的值)。
    • 你为什么要..., FPnumbers*0.5, ymax = NFPnumbers*1.2, ...?为什么是 0.5 和 1.2?
    • 查看我在答案末尾添加的解释
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多