1

我知道标题使这听起来很容易,但我有一个 For 循环来绘制我的数据。随着值的变化,X 轴的限制也不同(每个图的起点和终点不同)。但是,我希望有一个已定义的 X 轴范围,该范围对于所有相似的图都保持不变。这很复杂,因为我想要的 X 有大约 40 个可能的范围。

对于每个图,我有一个我想从中选择的 x-lims 的数据框。它基本上看起来像:

   Trait  start    end
    A     123456   134567
    B     234546   245678
    C     234546   245678
    D     345678   356789

等等。所以,如果一个循环给我的值:特征 C,开始 = 235000 和结束 = 240000,我想自动使用第三组默认 X-lims。

编辑:添加了更多信息(特征)。

4

2 回答 2

4

如果您显示的 data.frame 被调用df(并且您确定您的变量end将大于start),这应该有效:

which(start > df$start & end < df$end)[1]

修改以回答修改后的问题

随着您添加更多条件,您可以扩展上述逻辑:

## Make your data easily reproducible for others
df <- read.table(text="Trait  start    end
    A     123456   134567
    B     234546   245678
    C     234546   245678
    D     345678   356789", header=TRUE)

## Set values from within your example loop
Trait <- "C"
start <- 235000
end <- 240000

## Get index of desired row
i <- which(Trait==df$Trait & start > df$start & end < df$end)[1]
## Extract xlim values in the form of a numeric vector
myxlim <- unname(unlist(df[i, c("start", "end")]))
myxlim
[1] 234546 245678
于 2012-06-25T14:02:27.843 回答
2

我不确定我是否完全遵循这个问题。如果我对您的理解正确,您希望确保每个图的范围为 11111(在此示例中,无论如何),但上限值和下限值会有很大差异。所以,现在,您正在寻找一种方法来创建您可能想要的所有可能的上限和下限的表格,然后您想在绘图时查找它们。

我建议您可以通过简单地编写 plot 语句来确保最小值和最大值始终相距 11111 来更容易地做到这一点。

假设您在一次循环迭代中得到了 start <- 235000、end <- 240000 和 trait <- B。你能像这样构造你的代码吗?

diff <- end-start
gap <- 11111-diff
plot(thing_you_plot,xlim(start-(gap/2),end+(gap/2))

带数字:

diff <- 240000-235000 (5000)
gap <- 11111-5000 (6111)
plot(thing_you_plot,xlim(235000-(6111/2),240000+(6111/2)) 

(x limits are: 231944.5,243055.5, making the plot 11111 in length)

显然,如果您愿意,可以使用下限和上限函数来获取整数而不是小数。您的问题尚不清楚“特征”如何真正影响尺寸;如果你可以有两个使用相同维度绘制的特征(B 和 C),为什么你还需要这张表呢?我认为您可以使用简单的函数为每个绘图做得更好。

根据修订编辑:

乔什打败了我,但又来了,因为我几乎把它都打字了。

df <- data.frame(trait=c("A","B","C","D"),
                 start=c(123456,234546,234546,345678),
                 end=c(134567,245678,245678,356789))

trait <- "C"
start <- 235000
end <- 240000

xmin <- df[which(start > df$start & end < df$end & trait == df$trait),2]
xmax <- df[which(start > df$start & end < df$end & trait == df$trait),3]
于 2012-06-25T16:03:19.323 回答