我有一个数据框,其中一些变量几乎没有相对变化,而另一些变量呈现高变化。例如,请考虑以下数据框:
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'
,默认设置),我会得到以下内容:
这里有用于创建绘图的代码:
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比例,那么我得到以下结果:
在这里你有代码来产生第二个图:
# 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
。但我不知道在存在多个变量(和面板)的情况下如何做到这一点。
答案 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))))
答案 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)
编辑是必要的,因为我第一次尝试将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)