Вопрос по r – Создание 3D-графика, раскрашенного по оси Z

1
 library(Sleuth2)

 mlr<-lm(ex1222$Buchanan2000~ex1222$Perot96*ex1222$Gore2000)


for (i in 0:3) {
           assign(paste("betaHat", i, sep=""), 
           summary(mlr)$coeff[i+1,1])
               }

x<-sort(ex1222$Perot96)
y<-sort(ex1222$Gore2000)


z1 <- outer(x, y, function(a,b) betaHat0+betaHat1*a+betaHat2*b+betaHat3*a*b)
nrz <- nrow(z)
ncz <- ncol(z)

# Create a function interpolating colors in the range of specified colors
jet.colors <- colorRampPalette( c("blue", "red") ) 

# Generate the desired number of colors from this palette
nbcol <- 100
color <- jet.colors(nbcol)

# Compute the z-value at the facet centres
zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz]

# Recode facet z-values into color indices
facetcol <- cut(zfacet, nbcol)

persp(x, y, z1, col=color[facetcol],theta=-30, lwd=.3,xlab="Perot 96", ylab="Gore 2000", zlab="Predicted Votes for Buchanan")

Здравствуйте

Я пытаюсь раскрасить сюжет. Я думал, что хочу иметь более высокие значения 'z', окрашенные в более темные оттенки красного (или любого другого цвета на самом деле).

Любая помощь в том, как это сделать, будет принята с благодарностью.

Кроме того, не стесняйтесь предложить другую функцию, чтобы это произошло.

Спасибо

edit .... Я поместил свой новый код после просмотра примера на? persp. Я хотел бы изменить цвет, и я не очень доволен читаемостью нового сюжет

Пример 4 в?persp называется «Цвета поверхности, соответствующие z-значениям» и демонстрирует именно то, что вы просите. Не должно быть слишком сложно адаптировать его к вашим собственным данным. Josh O'Brien
хорошее предложение. Я посмотрю на это. Michael
Вы можете попробовать несколько цветовых палитр примерно так:plot(1:20, pch=16, col=colorRampPalette(c("white", "blue"))(20), cex=3) plot(1:20, pch=16, col=colorRampPalette(blues9)(20), cex=3). Если у вас есть тот, который вам нравится, вы можете добавить его вpersp() вызов. colorRampPalette()оначалу трудно понять @, так как он сам по себе возвращает функцию, а не палитру цветов, но это довольно круто, когда вы освоите его.) Josh O'Brien
Взглянул на этот пример. Это то, что я хочу, но они используют два цвета. Я хочу один цвет. Michael

Ваш Ответ

1   ответ
5

Я немного изменил твой код.

library(Sleuth2)

Обычно лучше использоватьdata аргумент, чем использовать предикторные переменные, извлеченные из фрейма данных через$:

mlr<-lm(Buchanan2000~Perot96*Gore2000,data=ex1222)

Мы можем использоватьexpand.grid() а такжеpredict() чтобы получить результаты регрессии в чистом виде:

perot <- seq(1000,40000,by=1000)
gore <-  seq(1000,400000,by=2000)

Если вы хотите, чтобы фасеты оценивались в местах наблюдений, вы можете использоватьperot <- sort(unique(ex1222$Perot96)); gore <- sort(unique(ex1222$Gore2000)) вместо.

pframe <- with(ex1222,expand.grid(Perot96=perot,Gore2000=gore))
mlrpred <- predict(mlr,newdata=pframe)

Теперь преобразуйте прогнозы в матрицу:

nrz <- length(perot)
ncz <- length(gore)
z <- matrix(mlrpred,nrow=nrz)

Я выбрал светло-красный #ffcccc, красный с небольшим количеством синего / зеленого) до темно-красного #cc0000, немного красного и ничего больше).

jet.colors <- colorRampPalette( c("#ffcccc", "#cc0000") ) 

Вы также можете использоватьgrep("red",colors(),value=TRUE) чтобы увидеть, что красные R встроил.

# Generate the desired number of colors from this palette
nbcol <- 100
color <- jet.colors(nbcol)

# Compute the z-value at the facet centres
zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz]
# Recode facet z-values into color indices
facetcol <- cut(zfacet, nbcol)

persp(perot, gore, z,
      col=color[facetcol],theta=-30, lwd=.3,
      xlab="Perot 96", ylab="Gore 2000", zlab="Predicted Votes for Buchanan")

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

Другой выбор - этоrgl пакет:

library(rgl)
## see ?persp3d for discussion of colour handling
vertcol <- cut(z, nbcol)
persp3d(perot, gore, z,
      col=color[vertcol],smooth=FALSE,lit=FALSE,
      xlab="Perot 96", ylab="Gore 2000", zlab="Predicted Votes for Buchanan")

Возможно, стоит взглянуть наscatter3d отcar package (на SO есть другие посты, описывающие, как настроить некоторые из его графических свойств).

library(car)
scatter3d(Buchanan2000~Perot96*Gore2000,data=ex1222)

Ну, на самом деле вы не сохраняете «исходные данные» - только координаты x и y. Смотрите правки. Илиrgl::persp3d илиcar:scatter3d даст вам динамически-перспективный сюжет ... Ben Bolker
Еще раз спасибо! По какой-то причине у меня возникают трудности с загрузкой пакета 'rgl' на мой Mac. Кажется, это немного актуальная проблема с этим пакетом в целом. Я согласен, что это не исходные данные, возможно, ваш путь лучше. Michael
Ben, Ваш метод получения модельных прогнозов, безусловно, намного проще, чем тот, который я использовал! Спасибо вам за помощь. Я думаю, что я предпочитаю сохранять исходные данные в графике, так как это позволяет вам увидеть немного больше о том, что происходит, как я чувствую. «Не очень доволен удобочитаемостью графика», я полагаю, мне просто неудобно показывать эту 3-мерную модель с различной кривизной на поверхности отклика с помощью одного 2-мерного графика. Сюжет, на который можно было бы нажать и перетащить, чтобы повернуть картинку, был бы потрясающим. Еще раз спасибо Michael

Похожие вопросы