Интерактивный R-график

#r #plot #rstudio

#r #график #rstudio

Вопрос:

У меня есть график R, и я бы хотел, чтобы пользователь мог щелкнуть точку на графике, и я хотел бы знать, где они щелкнули. Вроде как слушатель мыши. Я использую RStudio. Возможно ли это каким-либо образом? В принципе, для точки, на которую они нажимают, я хочу отобразить другой график с более подробной информацией об этой точке.

Вот что у меня есть:

 data <- data.frame(x=c(1,2,3,4,5),y=c(1,2,3,4,5))
x11()
plot(data)

loc <- locator(n=1)
if(loc$x > 2) {
  x11()
  plot(c(1,2,3),c(5,6,7))
}

loc <- locator(n=1)
if(loc$x > 2) {
  x11()
  plot(c(4,5,6),c(5,6,7))
}
 

Итак, появляется первый график с 5 точками данных. Если пользователь нажимает на значение x, равное 2, я хочу открыть другой график, на котором отображаются точки данных, которые вы видите в списке (3 точки данных). Затем, если они закроют этот график и снова нажмут на 2 на исходном графике с 5 точками данных, я хочу, чтобы он открыл новый график с 3 точками данных, которые вы видите во втором операторе if.

Но это вызывает у меня ошибки и проблемы с вводом-выводом.

Комментарии:

1. Отлично работает в сеансе Mac-GUI под управлением R 2.13.1 и Mac X11.

2. что вы имеете в виду под сеансом Mac-GUI?

3. 2-й щелчок не работает. для меня подходит только первое. 2-й щелчок ничего не делает, даже если я закрою первый график с 3 точками данных, который появляется до того, как я выполню 2-й щелчок на исходном графике

4. как я могу сделать так, чтобы исходный график x11 был активным графиком?

5. вы можете открывать и закрывать и устанавливать графические окна по умолчанию с помощью функций dev.set, dev.close и т. Д.

Ответ №1:

(Я понимаю, что это не полный ответ, но он не будет очень хорошо форматироваться как комментарий.) Чтобы сделать конкретное устройство активным, вам нужно определить его номер. После выполнения вашего кода я могу получить свой список устройств и установить первое устройство X11 как текущее

 dev.list()
#quartz    X11 quartz    X11    X11 
#     2      3      4      5      6 
dev.set(3)
#X11 
#  3 
 

Итак, попробуйте это:

 x11() ; first.ID <- dev.cur()
plot(data)

loc <- locator(n=1)
if(loc$x > 2) {
  x11() ; second.ID <- dev.cur()
  plot(c(1,2,3),c(5,6,7))
}
dev.set(first.ID)
loc <- locator(n=1)
if(loc$x > 2) {
  x11() ; third.ID <- dev.cur()
  plot(c(4,5,6),c(5,6,7))
}
 

На моей машине вам также нужно щелкнуть заголовок первого графического окна, чтобы открыть его, потому что графический интерфейс Mac не выводит активное устройство на передний план.

Комментарии:

1. Еще лучше (не стесняйтесь включать это в свой ответ, если хотите). Используйте dev.ID <- as.numeric(dev.cur()) сразу после создания устройства, чтобы получить его идентификатор. Вы можете использовать dev.set(dev.ID) для смены устройства в любое время.

2. Я думаю, что реальный ответ должен исходить от кого-то, у кого есть R внутри RStudio, поскольку взаимодействие с устройством, похоже, нарушено или сбито с толку каким-то образом, который невозможно воспроизвести на моей машине. Но если CodeGuy обнаружит, что наши комментарии указывают ему направление к успеху, я постараюсь исправить свой ответ.

3. в RStudio dev.cur() всегда будет возвращать одно и то же значение, независимо от того, на каком графике вы находитесь, если вы используете устройство RStudio. Однако, если вы используете X11() для создания нового графика, то dev.cur и dev.set т. Д. функции работают нормально.

Ответ №2:

Это отлично работает в RStudio, если вы выполняете locator() вызов встроенной панели графиков. Я думаю locator , что это вызов X11, который вызывает проблемы в RStudio. После построения подробной информации X11 вызовите dev.set(0) , чтобы снова активировать панель RStudio plots .

 data <- data.frame(x=c(1,2,3,4,5),y=c(1,2,3,4,5))
plot(data)

loc <- locator(n=1)
if(loc$x > 2) {
        x11()
        plot(c(1,2,3),c(5,6,7))
}

dev.set(0)

loc <- locator(n=1)
if(loc$x > 2) {
        x11()
        plot(c(4,5,6),c(5,6,7))
}
 

(Честно говоря, я не уверен, почему dev.set(0) это работает, нужно было бы уточнить у разработчика, который написал графическое устройство RStudio.)