2016-10-27 31 views
1

我有以下代碼。它產生一個水平圖,其中小於0的平方值應該以紅色調着色並且在藍色色調中具有大於0的值的正方形。然後我想要0的正方形顏色爲白色。然而,沒有任何事情變成白色。我怎樣才能解決這個問題?R中級別圖的顏色

第一列中的所有三個方塊應該是白色的。

library(lattice) 

cc = colorRampPalette(c("red", "white","blue")) 
trellis.par.set(regions=list(col=cc(20))) 
x = c(1,2,3,1,2,3,1,2,3) 
y = c(1,1,1,2,2,2,3,3,3) 
z = c(0,-2,-3,0,2,3,0,1,-1) 
df = data.frame(x,y,z) 
p <- levelplot(z~x*y, df, 
       panel=function(...) { 
       arg <- list(...) 
       panel.levelplot(...) 
       }) 
print(p) 

enter image description here


更新: 下面是試圖解決它重複的例子,但仍然是不完全正確: 這裏是一個dataframedf

x y   z 
1 1 1 -0.17457167 
2 2 1 0.93407856 
3 3 1 0.55129545 
4 4 1 0.97388216 
5 5 1 -1.00000000 
6 6 1 0.52883410 
7 7 1 -1.00000000 
8 8 1 0.85112829 
9 9 1 -1.00000000 
10 10 1 1.00000000 
11 11 1 -0.87714166 
12 12 1 1.00000000 
13 13 1 -0.95403260 
14 14 1 1.00000000 
15 15 1 -0.91600501 
16 16 1 1.00000000 
17 17 1 -1.00000000 
18 18 1 -0.38800669 
19 19 1 -0.52110322 
20 20 1 0.00000000 
21 21 1 -0.08211450 
22 22 1 0.55390723 
23 23 1 1.00000000 
24 24 1 -0.04147514 
25 25 1 -1.00000000 
26 26 1 -0.39751358 
27 27 1 -0.99550773 
28 28 1 0.00000000 
29 29 1 0.20737568 
30 30 1 0.00000000 
31 31 1 0.00000000 
32 32 1 0.00000000 
33 33 1 -0.26702883 

然後這裏是代碼:

cc = colorRampPalette(c("red", "white","blue")) 
trellis.par.set(regions=list(col=cc(21))) 
zrng <- range(z)  # what's the range of z 
tol <- 1e-2   # what tolerance is necessary? 
colorBreaks <- c(
    seq(zrng[1] - 0.01, 0 - tol, length.out = 11), 
    seq(0 + tol,zrng[2] + 0.01,length.out = 10)) 
p <- levelplot(z~x*y, df, 
       at = colorBreaks, 
       panel=function(...) { 
       arg <- list(...) 
       panel.levelplot(...) 
       }) 
print(p) 

它產生該圖中,其不具有用於在光譜的顏色白色的槽: enter image description here

+1

作爲指定爲白色的顏色的無 - '其中(cc(20)==「#FFFFFF」)'你需要做2個獨立的顏色坡道,從紅色到白色,然後是白色到藍色。 – thelatemail

+0

@thelatemail謝謝,我該怎麼做? – CodeGuy

回答

2

正如thelatemail指出,cc(20)絕不會產生白色("#FFFFFF")。您必須使用奇數來準確表示色階的中間值(結帳cc(3)cc(4))。

現在,您需要設置at參數levelplot來爲顏色設置斷點。默認是at = pretty(z)

#[1] -3 -2 -1 0 1 2 3 

但是你不想讓0成爲斷點。您希望它具有自己的顏色,並與顏色漸變的中間對齊。

您可以通過將斷點設置爲接近於0(在某些tol之內)來防止任何其他值映射爲白色。粗略的想法是通過執行如at = c(seq(-3.01, -0.00001, length.out = 11), seq(0.00001, 3.01, length.out = 11))或使用下面顯示的類似方法,爲0留下一點點。由於色階具有奇數個值,因此該序列需要偶數個值。 (即,3種顏色的彩色斜坡可以是由2個斷點除,但4個值的顏色漸變可以通過3個斷點被劃分)

trellis.par.set(regions=list(col=cc(21))) 

# Define a sequence of breaks for the at argument to levelplot. 
zrng <- range(z)  # what's the range of z 
tol <- 1e-5   # what tolerance is necessary? 
colorBreaks <- c(
    seq(zrng[1] - 0.01, # adding a small buffer on end 
     0 - tol, 
     length.out = 11), 
    seq(0 + tol, 
     zrng[2] + 0.01, 
     length.out = 11)) 
     # note, I chose length.out = 11. 
     # Don't do more than roughly ceiling((# of colors)/2) 


p <- levelplot(z~x*y, df, 
       at = colorBreaks, 
       panel=function(...) { 
       arg <- list(...) 
       panel.levelplot(...) 
       }) 

enter image description here

+0

嗨,非常感謝。我嘗試了一個不同的數據集,添加了更多的填充,現在我得到了這樣的內容:https://img42.com/vSz6n(它具有所需的效果,但白色不落在0標記處) – CodeGuy

+0

I應該提到。我仍然使用cc(21),它確實產生#FFFFFF,但色譜沒有白色。 – CodeGuy

+0

@CodeGuy我明白了。你在at的參數需要包含偶數個值,0代表中間值。沒有偶數,就沒有「中間」。因此,而不是'length.out = 10'和'length.out = 11'使它們都是一個或另一個,以便序列具有偶數個條目。如果您的頻譜中有4種顏色,則有3個(或5個計數極值)斷點。奇數,如21,你需要一個偶數個斷點。 – Jota