Создание 3D-графика, раскрашенного по оси Z
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', окрашенные в более темные оттенки красного (или любого другого цвета на самом деле).
Любая помощь о том, как это сделать, будет принята с благодарностью.
Кроме того, не стесняйтесь предложить другую функцию, чтобы это произошло.
Спасибо!
редактировать.... Я поставил свой новый код после просмотра примера на?persp. Я хотел бы изменить цвет, и я не очень доволен читаемостью нового сюжета
1 ответ
Я немного изменил твой код.
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
пакет (есть другие посты на SO, описывающие, как настроить некоторые из его графических свойств).
library(car)
scatter3d(Buchanan2000~Perot96*Gore2000,data=ex1222)