1

我有一个数据框,其中一些变量呈现出很小的相对变化,而另一些则呈现出很大的变化。例如,考虑以下数据框:

df <- data.frame(IDX = 1:10, V1 = runif(10) + 100000, V2 = runif(10))

内容如下:

   IDX       V1         V2
1    1 100001.0 0.39601382
2    2 100000.1 0.76472032
3    3 100000.1 0.10183021
4    4 100000.2 0.12735142
5    5 100000.8 0.21488898
6    6 100000.1 0.92675265
7    7 100000.5 0.27987290
8    8 100000.6 0.69132304
9    9 100000.5 0.20719782
10  10 100000.8 0.02314787

两个变量的绝对变化相似(V1 为 0.10,V2 为 0.09)。但是,如果我们考虑相对于它们的均值的相对变化,那么 V1 的变化很小,而 V2 的变化则相反:

> var(df$V1) / mean(df$V1)
[1] 1.082472e-06
> var(df$V2) / mean(df$V2)
[1] 0.2617366

当我尝试为这两个变量制作点图并尝试设置 X 比例的限制时,问题就出现了。如果我对每个变量(relation = 'same'默认设置)使用相同的比例,我会得到以下结果:

情节1

这里有用于创建绘图的代码:

library(lattice)
library(reshape2)
df <- melt(df, id.vars = 'IDX')

# approach 1
pl <- dotplot(IDX ~ value | variable, df,
              scales = list(x = list(relation = 'same')))
print(pl)

如您所见,V2 的值是如此之小,以至于当对两个面板使用相同的比例时,似乎 V2 值之间没有变化。如果我使每个面板的 X 比例独立,那么我得到以下结果:

情节2

在这里,您有生成第二个图的代码:

# approach 2
pl <- dotplot(IDX ~ value | variable, df,
              scales = list(x = list(relation = 'free')))
print(pl)

现在的问题是左侧面板的 X 刻度范围从 100000.2 到 100001.0,数据看起来好像有很多变化,而实际上并非如此。

不知何故,我想获得一个图,其中左面板看起来像第一个图中的左面板,而右面板看起来像第二个图中的右面板。我的想法是根据所绘制变量的平均值来定义 X 范围。例如,对于每个面板,X 限制可以从0.9 * mean1.1 * mean。但我不知道在存在多个变量(和面板)的情况下如何做到这一点。

4

3 回答 3

2

最干净的解决方案可能是提供您自己的prepanel函数,它将“即时”设置每个面板的 x 限制。这是一个将 xlim 设置为从 0 扩展到面板中 x 的最大值的示例

dotplot(IDX ~ value | variable, df, scales=list(relation="free"),
        prepanel = function(x,y,...) list(xlim=c(0, max(x))))

在此处输入图像描述

于 2013-01-10T21:44:52.693 回答
1

xyplot(和点图)的帮助页面表明这应该是可能的:“当关系为“自由”时,xlim 或 ylim 可以是一个列表,在这种情况下,它被视为其组件是从 prepanel 计算中获得的极限值每个面板(必要时复制后)。”

尝试(编辑):

pl <- dotplot(IDX ~ value | variable, df, 
          xlim=list(c(1,100001), c(0, 1) ),
          scales = list(x = list(relation = 'free'   )
                       ))
print(pl)

在此处输入图像描述 之所以需要进行编辑,是因为我首先尝试将 xlim 放在 scales 参数中(毕竟这是我得到那部分文本的地方。)我认为在这种情况下可能需要做一些进一步的工作,或者可能需要交换顺序,因为低- 100000 中的“0”顺序“模糊”到第二个刻度上的“0.0”。

于 2013-01-10T20:13:38.410 回答
0

想法是应用log

df <- data.frame(IDX = 1:10, V1 = log(runif(10) + 100000), V2 = runif(10))

library(lattice)
library(reshape2)
df <- melt(df, id.vars = 'IDX')

# approach 1
pl <- dotplot(IDX ~ value | variable, df,
              scales = list(x = list(relation = 'same')))
print(pl)

在此处输入图像描述

于 2013-01-10T18:54:03.843 回答