2016-10-27 2 views
1

У меня есть следующий код. Он создает уровень, в котором квадратные значения меньше 0 должны быть окрашены в красный оттенок и квадраты со значениями больше 0 в синем оттенке. И тогда я хотел бы, чтобы квадраты со значениями 0 были окрашены в белый цвет. Однако ничто не заканчивается белым. Как я могу это исправить?Цвет levelplot в 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


Update: Вот воспроизводимый пример, который пытается это исправить, но все же не совсем верно: Вот 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"). Вы должны использовать нечетное число для того, чтобы среднее значение цветовой рампы было точно представлено (checkout cc(3) против cc(4)).

Теперь необходимо установить аргумент at для levelplot, чтобы установить точки останова для цветов. По умолчанию at = pretty(z):

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

Но вы не хотите, чтобы быть 0 точки останова. Вы хотите, чтобы у него был собственный цвет, и выровняйте его с серединой цветовой рампы.

Вы можете достичь этого, установив точки останова как можно ближе к 0 по мере необходимости (в пределах tol), чтобы другие значения не отображались на белом. Грубая идея - оставить небольшое место для 0, сделав что-то вроде этого at = c(seq(-3.01, -0.00001, length.out = 11), seq(0.00001, 3.01, length.out = 11)) или используя аналогичный метод, показанный ниже. Поскольку цветовая рампа имеет нечетное число значений, для последовательности требуется четное количество значений. (Т.е. цвета рампа 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

Смежные вопросы