Как я могу воссоздать эту трехмерную гистограмму?

Я про эту картинку:

Вопросы:

Это R, а не Matlab, верно? Ниже на странице написано, что он был сделан с помощью R....

Как я могу это сделать? Я имею в виду, как я могу создать такую ​​трехмерную диаграмму рассеивания с этой улучшенной зеленой поверхностью и этой сеткой? Теперь я знаю, как сделать простые диаграммы рассеяния, а также трехмерные диаграммы рассеяния, но как я могу создать такое сложное изображение? Какой это пакет?

Я хочу включить его в статью, где эта картинка должна вращаться автоматически. Я знаю, как включить это в свой текс-дистрибутив, но поэтому мне нужен один png. Так, например, 1000 отдельных картинок, которые я анимирую. Но как я могу получить их с R? Мне нужно было бы повернуть его, а затем сохранить каждое маленькое вращение в виде графического файла.

Большое спасибо за вашу помощь, мои самые большие проблемы связаны с созданием этой графики (пакетов?) и как заставить ее вращаться (код r?)


person user1690846    schedule 14.11.2012    source источник
comment
Похоже, они исправили пакет rgl для создания дампа файла .png. В последний раз, когда я пробовал этот пакет, он отображал график на экране (и я мог вращать его, увеличивать/уменьшать масштаб и т. д.), но он не сохранял изображение в файл. Похоже, в новой версии (0.92.894 2012-10-22) это исправлено.   -  person bill_080    schedule 15.11.2012
comment
Когда этот вопрос был перенесен, комментарий @nico был утерян. Вот его ссылка: stackoverflow.com /questions/3979240/ Вот ссылка из моего комментария выше: stackoverflow.com/questions/4543272/   -  person bill_080    schedule 15.11.2012


Ответы (1)


  1. Чтобы создать эту фигуру, вы можете проверить функцию persp. Вы можете изменить параметр, чтобы повернуть фигуру. Вот одна демонстрация:

    require(grDevices) # for trans3d
    x <- seq(-10, 10, length= 30)
    y <- x
    f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
    z <- outer(x, y, f)
    z[is.na(z)] <- 1
    persp(x, y, z, theta = 90, phi = 30, expand = 0.5, col = "lightgreen")
    

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

При изменении theta = 30:

persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightgreen")

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

  1. Для цвета вы можете ввести colors(), чтобы увидеть, какой цвет вы можете использовать. В настоящее время я обнаружил, что lightgreen может быть наиболее близким цветом, который вам нужен.
person liuminzhao    schedule 15.11.2012
comment
хорошо, во-первых: большое спасибо за ответы. Но у меня есть еще вопросы: 1. Мне нужно сохранить разные, например. png с разными ангелами (разное вращение), чтобы я мог соединить их с фильмом, могу ли я сделать это с помощью пакета rgl? @liuminzhao тета для левого и правого, так что фи для верха и низа? Я хочу сохранить отдельные небольшие шаги вращения в виде изображения и объединить их с фильмом/анимацией. Как я могу это сделать? Также у меня нет функции, у меня есть эмпирические данные, например. Я хочу, чтобы участок Веги Блэка-Шоулза зависел от цены актива и времени до погашения. Еще раз большое спасибо за вашу помощь! - person user1690846; 15.11.2012
comment
о, и еще один вопрос: как я могу иметь причудливые цвета, крайние значения которых красные, а затем плавное изменение цвета, например, синий для низких значений? То есть не дискретные изменения, а непрерывные? Большое спасибо @bill_080 и люминьчжао - person user1690846; 15.11.2012
comment
1. не знаком с пакетом rgl. 2. Я так думаю о phi 3. Вы могли бы попробовать цикл for построить кучу png и сделать их gif? попробовать animation пакет? 4. Я думаю, что с эмпирическими данными все в порядке, если у вас есть значение z, соответствующее его координатам (x, y). - person liuminzhao; 15.11.2012
comment
Чтобы узнать о цветах, все еще проверяйте help(persp). В примере 4 # (4) Цвета поверхности, соответствующие z-значениям. Это то, что вы ищете? - person liuminzhao; 15.11.2012
comment
Также ознакомьтесь с пакетом анимации в R. Он похож на программу ImageMagick и позволяет легко превращать ваши изображения в фильм или анимированный gif. - person Peter Ellis; 24.11.2012