2013-01-10 47 views
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 

的絕對變化爲兩個變量是類似(0.10 V1和0.09 V2)。但是,如果我們認爲相對於他們的手段的相對變化,則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 * mean1.1 * mean。但我不知道如何在多個變量(和麪板)的情況下做到這一點。

回答

2

最乾淨的解決方案可能會提供您自己的prepanel函數,該函數將設置每個面板的x-limit'on the fly'。這裏是設置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

+0

哇一個例子!這真的很乾淨。我不能停止驚訝格子是如何:) – betabandido

+0

@betabandido你我都。補充'latticeExtra'和'Grid'(加上'sp'和'rasterVis'來表示空間情節),它是非常強大的! –

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

1

的幫助頁面xyplot(和點陣圖)認爲這應該是可能的:「當關系是 「自由」,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尺度參數內(畢竟這是在那裏我得到的文本的那個部分。)我認爲在這種情況下可能需要做一些進一步的工作,或者交換訂單,因爲100000的低階「0」在第二個等級上模糊爲「0.0」。

相關問題