Интерактивно изменить масштаб оси (линейный / логарифм) в графическом изображении с помощью R - PullRequest
0 голосов
/ 05 марта 2020

Цель: Создание интерактивных выпадающих меню / кнопок для обновления шкалы осей для фигуры Plotly из R.

Проблема: Существует много документации при создании кнопок и логов с использованием layout и updatemenus; однако было трудно найти тот, который описывал, как кнопка может быть добавлена ​​специально для изменения масштаба осей. Некоторые сообщения о stackoverflow предоставили решения для этого в python, но я изо всех сил пытался найти эквивалентный для R. Я предоставил здесь решение / пример, основанный на решении python.

Начальная точка: С небольшим набором данных, я хочу создать график c, который может изменять масштаб с линейного на лог и иметь разные трассы на графиках. Я предоставил свое собственное решение, но если у кого-то есть более креативное решение, не стесняйтесь добавлять!

data <- data.frame(x = c(1, 2, 3), 
                   y = c(1000, 10000, 100000),
                   y2 = c(5000, 10000, 90000))

1 Ответ

1 голос
/ 05 марта 2020

Вот решение на основе того, что в python из предоставленной ссылки ; было немного сложно понять, как глубоко вложить все list с. Если вы не добавляете видимость к трассам, вы можете заменить ее ссылкой на набор данных.

library(plotly)
library(magrittr)

# Fake data
data <- data.frame(x = c(1, 2, 3), 
                   y = c(1000, 10000, 100000),
                   y2 = c(5000, 10000, 90000))

# Initial plot with two traces, one off
fig <- plot_ly(data) %>% 
  add_trace(x = ~x, y = ~y, type = 'scatter', mode = 'lines', name = 'trace1') %>%
  add_trace(x = ~x, y = ~y2, type = 'scatter', mode = 'lines', name = 'trace2', visible = F)

# Update plot using updatemenus, keep linear as first active, with first trace; second trace for log
fig <- fig %>% layout(title = 'myplot',
                      updatemenus = list(list(
                        active = 0,
                        buttons= list(
                          list(label = 'linear',
                               method = 'update',
                               args = list(list(visible = c(T,F)), list(yaxis = list(type = 'linear')))),
                          list(label = 'log',
                               method = 'update', 
                               args = list(list(visible = c(F,T)), list(yaxis = list(type = 'log'))))))))

Вывод выглядит так: enter image description here enter image description here

...