设置包含具有不同变异程度的变量的数据集的绘图比例限制

时间:2013-01-10 18:27:11

标签: r plot lattice

我有一个数据框,其中一些变量几乎没有相对变化,而另一些变量呈现高变化。例如,请考虑以下数据框:

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',默认设置),我会得到以下内容:

plot1

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

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比例,那么我得到以下结果:

plot2

在这里你有代码来产生第二个图:

# 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 * mean变为1.1 * mean。但我不知道在存在多个变量(和面板)的情况下如何做到这一点。

3 个答案:

答案 0 :(得分: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))))

enter image description here

答案 1 :(得分:1)

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

尝试(编辑):

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

enter image description here 编辑是必要的,因为我第一次尝试将xlim放在scale参数中(毕竟这是我获得该部分文本的地方。)我认为在这种情况下可能需要进一步的工作,或者可能需要交换订单,因为低 - 在第二个刻度上将100000“0”的“0”变为“0.0”。

答案 2 :(得分: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)

enter image description here