Есть ли в plotly функциональность, позволяющая сделать что-то похожее на hjust /vjust или position_dodge в R?

#position #plotly #data-visualization #r-plotly #ggplotly

#позиция #plotly #визуализация данных #r-plotly #ggplotly

Вопрос:

Я надеюсь настроить расположение точек и линий на графике гантели, чтобы разделить столбцы, а не накладывать их друг на друга, подобно position dodge или hjust / vjust в R.

Приведенный ниже код создает нечто близкое к тому, что я хотел бы, но штанги накладываются друг на друга.

 urlfile <- 'https://raw.githubusercontent.com/charlottemcclintock/GenSquared/master/data.csv'
df <- read.csv(urlfile)

p <- plot_ly(df, color = I("gray80")) %>%
  add_segments(x = ~mom, xend = ~daughter, y = ~country, yend = ~country, showlegend = FALSE) %>%
  add_markers(x = ~mom, y = ~country, name = "Mother", color = I("purple")) %>%
  add_markers(x = ~daughter, y = ~country, name = "Daughter", color = I("pink")) %>%
  add_segments(x = ~dad, xend = ~son, y = ~country, yend = ~country, showlegend = FALSE) %>%
  add_markers(x = ~dad, y = ~country, name = "Father", color = I("navy")) %>%
  add_markers(x = ~son, y = ~country, name = "Son", color = I("blue")) %>%
  layout(
    title = "Gender educational disparity",
    xaxis = list(title = "Mean Years of Education"),
    margin = list(l = 65)
  )
p
  

Приведя названия стран к множителю, я могу получить идеальный интервал, но я теряю метки стран, которые я надеюсь сохранить. Я пытался использовать country и индекс числового фактора вместе, но plotly не допускает одновременного дискретного и непрерывного масштабирования.

 df$cnum <- as.numeric(as.factor(df$country))
p <- plot_ly(df, color = I("gray80")) %>%
  add_segments(x = ~mom, xend = ~daughter, y = ~cnum .2, yend = ~cnum 0.2, showlegend = FALSE) %>%
  add_markers(x = ~mom, y = ~cnum .2, name = "Mother", color = I("purple")) %>%
  add_markers(x = ~daughter, y = ~cnum .2, name = "Daughter", color = I("pink")) %>%
  add_segments(x = ~dad, xend = ~son, y = ~cnum-.2, yend = ~cnum-.2, showlegend = FALSE) %>%
  add_markers(x = ~dad, y = ~cnum-.2, name = "Father", color = I("navy")) %>%
  add_markers(x = ~son, y = ~cnum-.2, name = "Son", color = I("blue")) %>%
  layout(
    title = "Gender educational disparity",
    xaxis = list(title = "Mean Years of Education"),
    margin = list(l = 65)
  )
p
  

Я бы хотел, чтобы это выглядело так:
статический, а именно

Но с названиями стран по оси y.

Есть ли способ отрегулировать высоту по вертикали относительно точки дискретной оси?

Ответ №1:

Обновление: это не элегантно, но я нашел обходной путь, перезаписав ось y осью y сечения! Все равно хотелось бы получить лучший ответ, но это полезное исправление!

 df$arb=15
plot_ly(df, color = I("gray80")) %>%
            add_segments(x = ~mom, xend = ~daughter, y = ~cnum .2, yend = ~cnum .2, showlegend = FALSE) %>%
            add_markers(x = ~mom, y = ~cnum .2, name = "Mother", color = I("purple"), size=2) %>%
            add_markers(x = ~daughter, y = ~cnum .2, name = "Daughter", color = I("pink"), size=2) %>%
            add_segments(x = ~dad, xend = ~son, y = ~cnum-.1, yend = ~cnum-.1, showlegend = FALSE) %>%
            add_markers(x = ~dad, y = ~cnum-.1, name = "Father", color = I("navy"), size=2) %>%
            add_markers(x = ~son, y = ~cnum-.1, name = "Son", color = I("blue"), size=2) %>%
            add_markers(x = ~arb, y = ~country, name = " ", color = I("white"), yaxis = "y2") %>%
            layout(
                yaxis=list(title="", tickfont=list(color="white")),
                yaxis2 = list(overlaying = "y", side = "left", title = ""))
            )