Plotly: как создать заполненную область с цветным градиентом? - PullRequest
1 голос
/ 14 января 2020

Я хочу создать квадрат квадрата с заливкой в ​​R, например, так:

library(plotly)

p <- plot_ly() %>%
  add_trace(
    x = c(0, 1, 1, 0),
    y = c(0, 0, 1, 1),
    type = 'scatter',
    fill = 'toself',
    fillcolor = '#ab63fa',
    hoveron = 'points+fills',
    marker = list(
      color = '#ab63fa'
    ),
    line = list(
      color = '#ab63fa'
    ),
    text = "Points + Fills",
    hoverinfo = 'text'
  ) 
p

Но это цвет с градиентом радуги, как у куба на графике me sh this Веб-страница . Как я мог это сделать?

1 Ответ

0 голосов
/ 29 января 2020

Сначала я, вероятно, неправильно вас понял и создал plot_ly - график, как я понял ваш вопрос - см. Текст и пример ниже горизонтальной линии.

Но потом у меня возникли сомнения , если это было то, что вы искали. К сожалению, у меня нет ответа в plot_ly в терминах того, о чем вы, вероятно, просите, но я могу предложить что-то в стиле ggplotly .

После определения числа областей n создается новый фрейм данных, который строит два столбца, в которых x-столбец разделен на n частей, а y-столбец повторяет значение y (1) n раз.

Тогда ggplot делается с geom_area. Цвет приходит через scale_color_gradientn. Этот метод строит n областей в каждой позиции на оси X с изменяющимся цветом. Таким образом, изменяя n, вы меняете количество этих областей. Просто уменьшите n, и вы увидите отдельные области в виде столбцов.

Я думаю, это демонстрирует для простого случая, что можно сделать.

library(ggplot2)
library(plotly)
#> 
#> Attache Paket: 'plotly'
#> The following object is masked from 'package:ggplot2':
#> 
#>     last_plot
#> The following object is masked from 'package:stats':
#> 
#>     filter
#> The following object is masked from 'package:graphics':
#> 
#>     layout
# define number of segments
n = 400 

df <- data.frame(x = seq(0, 1, by = 1/n), y = rep(1, n+1))

p <- ggplot(df, aes(x=x, y=y)) #+ geom_point()
pp <- p + geom_area(aes(group =x, color =x)) +
  theme_minimal() + #coord_flip() +
  scale_color_gradientn(colours = rainbow(10, s = 1, v = 1, start = 0, end = max(1, 10 - 1)/10, alpha = 1)) 
ggplotly(pp)

Создано в 2020-01-29 пакетом Представить (v0.3.0)


Первое решение :

В приведенном ниже коде я сначала построил фрейм данных, а затем использовал transform и набрал groupby, чтобы определить в списке стилей два цвета для двух значений в df$y. Если я смотрю на веб-страницу, на которую вы указываете, я вижу синий-i sh цвет, без градиента. Итак, я предполагаю, что вы хотите цвет с кодом #ab63fa. Я использовал два цвета для четырех точек - которые сгруппированы в 2 группы - черный и # ab63fa .

df <- data.frame(x = c(0, 1, 1, 0),
       y = c(0, 0, 1, 1))

plot_ly(
  type = 'scatter',
  x = df$x,
  y = df$y,
  mode = 'markers',
  transforms = list(
    list(
      type = 'groupby',
      groups = df$y,
      styles = list(
        list(target = 0, value = list(marker =list(color = '#ab63fa'))),
        list(target = 1, value = list(marker =list(color = 'black')))
      )
    )
  )
)

Этот код основан на примере от сюжет

...