2016-10-09 3 views
3

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

Я попытался это:

require(plotly) 
p1 <- plot_ly(data=iris,x=~Sepal.Length,y=~Sepal.Width,split=~Species) %>% layout(showlegend = FALSE) 
p2 <- plot_ly(data=iris,x=~Sepal.Length,y=~Sepal.Width,split=~Species) %>% layout(showlegend = TRUE) 
subplot(p1,p2) 
subplot(p2,p1) 

Но это не работает: кажется, как будто только один атрибут showlegend был обработан, поэтому, если я начну с p1 У меня есть две легенды, если я начну с p2 I есть два.

Любые идеи?

+0

Что вы 'packageVersion ("plotly")'? Я получил «4.5.2» - кажется, работает как ожидалось (=> одна легенда или нет легенды) – lukeA

+0

@lukeA: такая же версия, как ваша, но я не был ясен: я ожидаю получить только легенду для участка p2. Насколько я понимаю, вы получаете тот же результат, который я получаю. – Malta

+0

А теперь я вижу. Вы хотите, чтобы одна легенда с unqiue _Species_ значениями и сейчас, они удваиваются. Однако я не знаю, как это достичь. – lukeA

ответ

3

Приведенный выше ответ приводит к незначительной проблеме. Легенда только интерактивна с первым сюжетом. Вам нужно добавить легендарную группу в функцию plot_ly, чтобы сделать легенду интерактивной с обоими графиками.

library(plotly) 
p1 <- 
    iris%>% 
    group_by(Species)%>% 
    plot_ly(x=~Sepal.Length, color= ~Species, legendgroup=~Species)%>% 
    add_markers(y= ~Sepal.Width) 
p2 <- 
    iris%>% 
    group_by(Species)%>% 
    plot_ly(x=~Sepal.Length, color= ~Species, legendgroup=~Species)%>% 
    add_markers(y= ~Sepal.Width, showlegend=F) 
subplot(p1,p2) 
+2

Спасибо, это здорово! Я точно понимаю, что способ сортировки ваших данных имеет важное значение: если вы сортируете данные по видам для p1, а rev (species) для p2, то график один и тот же, но когда вы отбираете что-то, он не подавляет тот же модальность справа и слева. Если вы факторизуете одни и те же уровни, одну и ту же проблему, это действительно тот порядок, который имеет значение. Это нормально или это ошибка, о которой следует сообщить? – Malta

8

Я дам вам два ответа, один прямой и один для лучшей практики и потомства (что также помогает лучше понять проблему):

  1. Прямой ответ:
    Попытка добавить showlegend = FALSE в функции plot_ly(), а не в layout(). Если мы посмотрим на документацию ?subplot:

    Параметры макета, найденные позже в последовательности графиков, будут переопределять параметры, найденные ранее в последовательности.

    Другими словами, макет showlegend возможен только с вашего последнего участка. Но использование опции showlegend функции plot_ly() повлияет на трассировку, сохраняя ее поведение в пределах вашего subplot. Ваш код теперь будет выглядеть следующим образом:

    require(plotly) 
    p1 <- plot_ly(data=iris,x=~Sepal.Length,y=~Sepal.Width,split=~Species,showlegend = F) 
    p2 <- plot_ly(data=iris,x=~Sepal.Length,y=~Sepal.Width,split=~Species, showlegend = T) 
    subplot(p1,p2) 
    
  2. Лучше практику под plotly 4.0 и выше.
    Используйте оператор трубы %>% и group_by() функцию вместо split следующим образом:

    p1 <- 
        iris%>% 
        group_by(Species)%>% 
        plot_ly(x=~Sepal.Length, color= ~Species)%>% 
        add_markers(y= ~Sepal.Width) 
    p2 <- 
        iris%>% 
        group_by(Species)%>% 
        plot_ly(x=~Sepal.Length, color= ~Species)%>% 
        add_markers(y= ~Sepal.Width, showlegend = F) 
    subplot(p1,p2) 
    

Эта практика позволяет лучше понять, как следы работы в plotly. Вы можете видеть, что данные сначала сгруппированы по Species, переданы функции plot_ly(), которая инициализирует график, и затем вы указываете свой тип трассы (маркеры), чтобы фактически сделать график.
Написание кода таким образом проще, если вы хотите добавить или удалить трассировки и их соответствующие параметры, добавить переменную группировки или разбить/суммировать таблицу.

1

В ответах, которые даются до сих пор, есть некоторые неопределенные моменты.

Прежде всего, группировка кадров данных не имеет никакого влияния, насколько я могу ее видеть. Речь идет о сортировке не группировки (как указывает Maltas comment above). Таким образом, кадр данных должен быть отсортирован по переменной, которая предназначена для группировки переменной. Но есть еще одна ошибка, которая тем не менее мешает работе кода.Кроме того, требуется legendgroup у вас есть, следовательно, обеспечить

  1. , что ваш кадр данных отсортирован по переменной группировки (к счастью, данные ирис уже отсортированы по Species)
  2. , что переменные вы используете не содержат пропущенных значения (NA).

Таким образом, это должно работать:

library(plotly) 
p1 <- 
    iris %>% 
    arrange(Species) %>% 
    plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species) %>% 
    add_markers(y = ~Sepal.Width) 
p2 <- 
    iris %>% 
    arrange(Species) %>% 
    plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species) %>% 
    add_markers(y= ~Sepal.Width, showlegend = FALSE) 

subplot(p1, p2) 

Следующие примеры не работают:

  1. Сортировка по неправильному переменной:

    p1 <- 
        iris %>% 
        arrange(Sepal.Length) %>% 
        plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species) %>% 
        add_markers(y = ~Sepal.Width) 
    p2 <- 
        iris%>% 
        arrange(Sepal.Length) %>% 
        plot_ly(x=~Sepal.Length, color= ~Species, legendgroup=~Species)%>% 
        add_markers(y = ~Sepal.Width, showlegend = FALSE) 
    
    subplot(p1, p2) 
    
  2. Переменные с пропущенными значениями:

    df <- iris 
    df$Sepal.Length[2] <- NA 
    head(df) 
    
    #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
    #> 1   5.1   3.5   1.4   0.2 setosa 
    #> 2   NA   3.0   1.4   0.2 setosa 
    #> 3   4.7   3.2   1.3   0.2 setosa 
    #> 4   4.6   3.1   1.5   0.2 setosa 
    #> 5   5.0   3.6   1.4   0.2 setosa 
    #> 6   5.4   3.9   1.7   0.4 setosa 
    
    p1 <- 
        df %>% 
        arrange(Species) %>% 
        plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species) %>% 
        add_markers(y = ~Sepal.Width) 
    p2 <- 
    df %>% 
        arrange(Species) %>% 
        plot_ly(x = ~Sepal.Length, color = ~Species, legendgroup = ~Species)%>% 
        add_markers(y = ~Sepal.Width, showlegend = FALSE) 
    
    subplot(p1, p2) 
    
+0

Я хочу подчеркнуть, что «кадр данных должен быть отсортирован по переменной, которая предназначена для группировки переменной». Просто потратил много времени на понимание, почему ответ @ Mette не работал на 'mtcars' с' factor (cyl) ':) – janosdivenyi

Смежные вопросы