#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.)