Как мне сопоставить категориальные переменные, чтобы закрасить контур точек на трехмерной диаграмме рассеяния в R Plotly? - PullRequest
2 голосов
/ 13 марта 2020

Этот код представляет собой простой трехмерный график рассеяния набора данных радужной оболочки Fisher с добавлением дополнительной категориальной переменной:


library(plotly)
roots <- factor(round(runif(n = dim(iris)[2],min = -.499,max = 2.499)))
my_iris <- cbind(data.frame(roots), iris)


plot_ly() %>%
  add_trace(data = my_iris, type = 'scatter3d', mode = "markers",
            x = ~Sepal.Length,
            y = ~Petal.Length,
            z = ~Sepal.Width, 
            color = ~Species,
            colors = c("red","blue","green")

  )


При просмотре этой справочной страницы: https://plot.ly/r/marker-style/

Мне удалось выяснить, что вы можете добавить контур к точкам, например так:

plot_ly() %>%
  add_trace(data = my_iris, type = 'scatter3d', mode = "markers",
            x = ~Sepal.Length,
            y = ~Petal.Length,
            z = ~Sepal.Width, 
            color = ~Species,
            colors = c("#00FA9A34","#B22222dd","#00BFFFee"),
            marker = list(

              line = list(
                color = "#aabbffdd",
                width = 2
              )

            )
  )

Глядя на этот сайт https://plot.ly/r/reference/#scatter3d сделал идею, что линии являются свойством маркеров scatter3d, которые в свою очередь имеют свойства color и width.

Теперь я пытаюсь отобразить цвета на контуры на основе моей новой переменной roots,

plot_ly() %>%
  add_trace(data = my_iris, type = 'scatter3d', mode = "markers",
            x = ~Sepal.Length,
            y = ~Petal.Length,
            z = ~Sepal.Width,
            color = ~Species,
            colors = c("#00FA9A34","#B22222dd","#00BFFF66"),
            marker = list(

              line = list(
                color = ~roots,
                colors = c("#000000ff","#f00f3355","#dd22ccbb"),
                width = 2
              )

            )
  )

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

Поэтому мой вопрос: есть ли способ сделать это эстетически c отображение? Возможно, вместо использования add_trace я должен использовать add_markers? Есть ли способ сделать это в 2d Scatter в Plotly R? Также был бы признателен за подсказки о том, как правильно изучить Plotly для R, так как страница документации, на которую я ссылался выше, немного непрозрачна, и, похоже, меньше графических ресурсов для изучения, чем для ggplot2.

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

мне кажется, что графически не позволяет указывать цвета контура маркеров.

Для надписей можно изменить текст при наведении. Или используйте аннотации:

Возможно, это не решит вашу проблему, но я надеюсь, что это будет полезно в любом случае.

# Yours data

library(dplyr)
library(plotly)
roots <- as.character(round(runif(n = dim(iris)[2],min = -.499,max = 2.499)))
my_iris <- cbind(data.frame(roots), iris)


# Changing plot
my_iris %>%
plot_ly(type = 'scatter3d', mode = "markers") %>%
  add_trace(x = ~Sepal.Length,
            y = ~Petal.Length,
            z = ~Sepal.Width,
            color = ~Species,
            colors = c("#00FA9A34","#B22222dd","#00BFFF66"),
            marker = list(
              line = list(
                color = ~roots,
                colors = c("#000000","#E35F13","#E3138B"),
                width = 6
              )
            ),
            hoverinfo = 'text',
            text = ~paste('</br> Species: ', Species,
                          '</br> Petal Length: ', Petal.Length,
                          '</br> Petal Width: ', Petal.Width,
                          '</br> Roots: ',roots)
            )

Выход:

image

0 голосов
/ 07 апреля 2020

Мне удалось найти решение, которое я все еще считаю неадекватным: установите переменную, которую вы используете, чтобы закрасить контуры маркера в цвета, которые вы хотите использовать сами:

library(plotly)
roots <- round(runif(n = dim(iris)[1],min = -.499,max = 2.499))
roots_colors <- vector(mode="character", length=length(roots))
#setting  the value of roots colors to be the colors we want
roots_colors[roots == 0] <- "#000000ff"
roots_colors[roots == 1] <-  "#ff0000ff"
roots_colors[roots == 2] <-  "#0000ffff"

my_iris <- cbind(data.frame(roots_colors), iris)

plot_ly() %>%
  add_trace(data = my_iris, type = 'scatter3d', mode = "markers",
            x = ~Sepal.Length,
            y = ~Petal.Length,
            z = ~Sepal.Width,
            color = ~Species,
            colors = c("#00FA9A34","#B22222dd","#00BFFF66"),
            marker = list(

              line = list(
                color = ~roots_colors,
                width = 2
              )

            )
  )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...