重叠并固定刻面中的x刻度(刻度=“自由”)以制作胶片

时间:2012-06-03 10:25:41

标签: r ggplot2 scale simulation facet

在@Justin的帮助下,我在另一篇文章中使用ggplot2中的facet_grid选项绘制了模拟结果。包含数据和答案的帖子位于:Use facet_grid option to plot column of dataframe with ggplot2

这里是原始样本数据的副本,其中添加了有关每种参数类型的scale_x min和max值的信息:

dat <- read.table(textConnection("P1 P2 P3 P4 R
1 2e-5 1.0 0.6 3 1
2 4e-6 1.5 0.7 1.5 2
3 6e-7 1.2 0.6 2.5 3 
4 8e-8 1.45  0.65 3.2 4
"))

scalx <- read.table(textConnection("P XMIN XMAX
1 1 10e-1 10e-10
2 2 0.5 3.0
3 3 0.0 1.5
4 4 2.0 5.0
"))

@justin给出的实际示例绘图代码:

library(ggplot2)
library(reshape2)
dat.melt <- melt(dat, id.vars='R')

ggplot(dat.melt, aes(x=0, y=value)) +
    geom_boxplot() +
    geom_point(aes(colour=factor(R))) +
    facet_wrap(~variable, ncol=1, scales='free') +
    coord_flip()

但是现在,我的项目是制作一部电影来展示多个模拟结果的演变,此时借助上面给出的代码,我获得了这样的伟大图形。

enter image description here

为了实现这一点,我需要修复每个方面的值,因为每个参数的范围可以在固定的极值之间,尽管这些值是从facet到facet的变化。

您是否知道facet_grid是否可行,因为我最近发现此问题与在github ggplot2项目存储库中指定不同方面的不同限制有关:https://github.com/hadley/ggplot2/issues/187。还有另一种替代解决方案可以实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

由于您希望扩展每个方面的比例(而不是限制/收缩它们),因此有可能。您需要将scalx重塑为与融化dat类似的格式:

xlims <- melt(scalx, id.vars="P")
xlims$P <- paste0("P", xlims$P)
names(xlims)[1] <- "variable"

melt之外,我使facet具有相同的格式和变量名称。然后可以将这个新数据框提供给geom_blank图层,以便它影响比例的限制,但实际上并没有绘制任何内容:

ggplot(dat.melt, aes(x=0, y=value)) +
    geom_boxplot() +
    geom_point(aes(colour=factor(R))) +
    geom_blank(data=xlims) +
    facet_wrap(~variable, ncol=1, scales='free') +
    coord_flip()

enter image description here

作为旁注,您的P4列为最少2,但实际上数据点为1.5。这表明这种方法只会扩大规模,而不是收缩它们。