3D-графика в R — использование 4-го измерения цвета

Я использую функцию plot3d для создания 3D-графика в моем R-скрипте. Я хотел бы добавить 4-е измерение, которое будет цветом. Как я могу это сделать?

В частности, предположим, что у меня есть следующий код:

plot3d(x, y, z, col=cols, size=2, type='s')

как бы я заполнил cols на основе вектора значений, действующего как мое 4-е измерение.


person CodeGuy    schedule 04.11.2011    source источник


Ответы (1)


Просто создайте палитру, а затем проиндексируйте ее с помощью сокращенной версии вашей переменной c:

x = rnorm(100)
y = rnorm(100)
z = rnorm(100)

c = z
c = cut(c, breaks=64)
cols = rainbow(64)[as.numeric(c)]

plot3d(x,y,z,col=cols)

введите здесь описание изображения

person John Colby    schedule 04.11.2011
comment
Я не знал о rainbow. Очень хорошо! - person ; 04.11.2011
comment
но как я мог добавить шкалу сбоку, показывающую мой диапазон цветов... как легенду для цветов - person CodeGuy; 04.11.2011
comment
Да, он очень гибкий и позволяет вам устанавливать начальные/конечные оттенки и т. д. В радужной справке также есть несколько других встроенных цветовых карт. Удачи! - person John Colby; 04.11.2011
comment
а как вы выбрали 64? это произвольное число? Вы можете объяснить, что это делает? - person CodeGuy; 04.11.2011
comment
@CodeGuy Я считаю, что у rgl все еще нет никаких способностей легенды / HUD. Я всегда просто добавлял легенду к рисунку постфактум. Я использую созданную мной небольшую удобную функцию (colbyimaging.com/wiki/statistics/color-bars).), что, конечно же, приветствуется. - person John Colby; 04.11.2011
comment
64 является произвольным ... это просто то, насколько плавными должны быть цветовые переходы. Иногда более плавное более полезно; иногда нет. - person John Colby; 04.11.2011
comment
Можете ли вы показать мне, как я могу использовать вашу функцию, чтобы добавить цветную полосу? - person CodeGuy; 04.11.2011
comment
поэтому, чтобы сделать его очень гладким, я мог бы сделать его действительно большим числом? Большое спасибо за Вашу помощь! - person CodeGuy; 04.11.2011
comment
color.bar(rainbow(64), min(c), max(c), title='C', ticks=round(seq(min(c), max(c), len=11), 2)) будет одним из способов сделать это. i.imgur.com/CGBrQ.png - person John Colby; 04.11.2011
comment
Правильно...большое число будет означать очень гладкое. - person John Colby; 04.11.2011
comment
когда я включаю строку color.bar, которую вы разместили, я получаю следующую ошибку: Ошибка в Summary.factor(c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,: max not значимо для факторов - person CodeGuy; 04.11.2011
comment
Сделайте цветную полосу, прежде чем превратить c в фактор. Или сохраните исходную версию вместо того, чтобы перезаписывать ее. - person John Colby; 04.11.2011
comment
Вы знаете, в этом ответе цвет не является 4-м измерением. Это просто выделение z-значений, то есть третьего измерения. Вы можете сделать это, например, с помощью инструмента drape в wireframe(). Истинный цвет 4-го измерения будет назначать цвета какому-либо другому атрибуту данных. Например, mydata<-data.frame(x,y,z,t) и используйте colors=rainbow(42)[cut(t,42)] -- вроде того. (И всегда используйте 42, так как это ответ на главный вопрос...) - person Carl Witthoft; 04.11.2011
comment
Верно. Я решил повторно использовать z здесь только для того, чтобы было ясно, что он работает. - person John Colby; 04.11.2011
comment
да, вместо cut(z...) я подключаю свое 4-е измерение. это неправильно? - person CodeGuy; 05.11.2011
comment
Опечатка... должно быть c = cut(c, ...), что бы вы ни выбрали для своего c. - person John Colby; 05.11.2011