2013-11-22 3 views
0

Я черчение совместной плотности два переменных х и у, используя kde2d и перспа.R: Разный цвета в двухмерной плотности участка в зависимости от значений х и у

Как я могу сделать следующее:

1) В зависимости от значений х и у, я хочу, чтобы цвет сюжет по-другому. То есть для значений x> .5 и y> .5 цвет должен быть синим и для x < = .5 и y < = .5 цвет должен быть красного цвета. В настоящее время весь график только синий (см. Код ниже).

2) Как я могу покрасить область под поверхностью (т. Е. Массу вероятности)? Я бы хотел покрасить его также синим и красным соответственно.

library(MASS) 
    i<-1 
    x<-NULL 
    y<-NULL 
    while (i<=30) { 
     x1 <- rnorm(1, 0, 1) 
     x2 <- rnorm(1, 0, 1) 
     x <- c(x, x1) 
     y<-c(y,x2) 
     i<-i+1 
    } 
    den3d <- kde2d(x, y) 
    persp(den3d,xlab="Var1", ylab="Var2", zlab="Density", shade = 0.1, col = "blue", box=TRUE) 

Справка приветствуется.

+0

Пожалуйста, измените цикл 'while' на' x <- rnorm (30); y <- rnorm (30) '. Это оскорбляет мою чувствительность. Вы никогда не должны выращивать объект в цикле, подобном этому, и имейте в виду, что большинство R-функций векторизованы. – Roland

ответ

1

Это отвечает на первый вопрос:

x <- rnorm(30) 
y <- rnorm(30) 

library(MASS) 
den3d <- kde2d(x, y) 

cols <- c("blue", "red")[(outer(na.omit(filter(den3d$x>0.5,c(1,1), sides=1)), 
           na.omit(filter(den3d$y>0.5,c(1,1), sides=1)), 
           "+")==4) + 1] 

persp(den3d,xlab="Var1", ylab="Var2", zlab="Density", 
     shade = 0.1, col = cols, box=TRUE, phi=90) 

enter image description here

Обратите внимание, что фасет только окрашен в красный цвет, если его х и у значения> во всем диапазоне фасета 0,5.

Я не думаю, что вы должны делать то, что вы описываете во втором вопросе. Во всяком случае, persp не предназначен для этого.

Редактировать: Что там происходит?

den3d$x - значения x для построения графика. Нам нужно проверить каждый фасет, если значения х на обоих концах> 0,5. Мы можем сделать это, вычислив сумму этих значений. Это может быть сделано с помощью filter (см help("filter") документации):

filter(den3d$x>0.5,c(1,1), sides=1) 
#[1] NA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2 

Логические входные значения были автоматически принуждать к 0 и 1 по filter. Результирующие значения 0 указывают> 0,5 ни на одном из концов, из 1 указывают> 0,5 на одном конце и 2 указывают> 0,5 на обоих концах. NA нам нужно удалить.

Мы также делаем это для den3d$y, а также вычисляем внешнюю сумму, которая может приводить к значениям между 0 и 4. 0 и 4 означает, что все четыре границы фасетки не равны и равны> 0,5 соответственно. Значения с 1 по 3 показывают от 1 до 3 границ> 0,5. Мы устанавливаем все значения 4 (те, которые мы хотим покрасить «красным») на TRUE, а остальные - на FALSE, используя ==. Так как нам нужны значения 1 для FALSE и 2 для TRUE, чтобы подмножество цветового вектора, мы (автоматически) принуждаем логические значения к 0 и 1 и добавляем 1.

Вот оно.

+0

Спасибо, Роланд. Не могли бы вы кратко объяснить ваше решение. То есть (1) Какова цель аргумента ** c (1,1) ** в ** filter ** (2) и какая цель делает ** «+») == 4) ** в ** external * * have и (3) почему добавлен +1? – user3021506

+0

См. Редактирование. Надеюсь, это поможет. – Roland

+0

** Большой ***! Большое спасибо. – user3021506