Как добавить точки к двум графикам параллельно? (в Р)

Я ищу способы добавить точки к трем разным графикам параллельно.

У меня есть три точечных графика с именами s3d1, s3d2 и s3d3 в одном окне.

layout(matrix(c(1,2,1,3),2, 2, byrow = TRUE))
s3d1<-scatterplot3d(mtcars[,3],mtcars[,4],mtcars[,5],main="common",pch=20)
s3d2<-scatterplot3d(mtcars[,3],mtcars[,4],mtcars[,5],main="common",pch=20)
s3d3<-scatterplot3d(mtcars[,3],mtcars[,4],mtcars[,5],main="common",pch=20)

Если я попытаюсь добавить очки к s3d1,

s3d1$points3d(mtcars[,3],mtcars[,4],mtcars[,5],col="red")

Очки достанутся s3d3, но не s3d1. Что мне не хватает?

Дополнительная информация: я получаю точки данных во время работы программы. Итак, мне нужно добавлять точки к каждому из этих графиков по мере того, как я получаю данные, относящиеся к этому конкретному графику.

Обновление:

Пробовал также функцию par()

par(fig=c(0,0.65,0,1), new=TRUE)
s3d1<-scatterplot3d(mtcars[,3],mtcars[,4],mtcars[,5],main="common",pch=20)
par(fig=c(0.7,1,0.5,1), new=TRUE)
s3d2<-scatterplot3d(mtcars[,3],mtcars[,4],mtcars[,5],main="common",pch=20)
par(fig=c(0,0.65,0,1), new=TRUE)
s3d1$points3d(mtcars[,3],mtcars[,4],mtcars[,5],col="red")

s3d1$points3d не добавляет новые точки к s3d1 (и даже к s3d2). Есть идеи ?


person 384X21    schedule 13.12.2011    source источник


Ответы (1)


Если вы посмотрите на источник points3d(), просто попытавшись выполнить s3d1$points3d, вы увидите, что он просто добавляет точки к существующему графику, который, как предполагается, уже открыт. Другими словами, точки/графики хранятся не в объектах s3d1,2,3, а просто информация о преобразовании, необходимая для построения различных представлений.

Итак, чтобы сделать то, что вы пытаетесь сделать, вам просто нужно использовать обычные команды графического устройства. Например, dev.new откроет новое окно графика, а dev.set может переключаться между активными. Вы можете сделать что-то вроде:

dev.new(); h1=dev.cur()
s3d1<-scatterplot3d(mtcars[,3],mtcars[,4],mtcars[,5],main="common",pch=20)
dev.new(); h2=dev.cur()
s3d2<-scatterplot3d(mtcars[,3],mtcars[,4],mtcars[,5],main="common",pch=20)
dev.new(); h3=dev.cur()
s3d3<-scatterplot3d(mtcars[,3],mtcars[,4],mtcars[,5],main="common",pch=20)
dev.set(h1)
s3d1$points3d(mtcars[,3],mtcars[,4],mtcars[,5],col="red")

Также посетите ?dev.new для получения дополнительной информации.

person John Colby    schedule 13.12.2011
comment
Извините, я, должно быть, сообщил об этом раньше: на самом деле я рисую все три в одном окне, используя layout(). Таким образом, использование dev.new() открывает новое окно, что нежелательно. - person 384X21; 13.12.2011
comment
Ооо... спасибо за разъяснение! Вызов points3d использует ячейку, которая была построена последней, то есть нижнюю правую. Я думаю, что лучшее решение - просто строить с нуля каждый цикл. Удачи! - person John Colby; 13.12.2011
comment
@user1029725 user1029725 Да, я нашел layout наиболее полезным, когда мне просто нужно быстро нарисовать несколько графиков. Для большего количества пользовательских сюжетов я всегда использовал par(mfrow) и т.д. - person John Colby; 13.12.2011