8

次の図は私が探しているものに近いですが、次のことが可能かどうかを知りたいです:

  • x 軸に沿って正当化されるのではなく、ノードを左揃えにしますか?たとえば、ノードが 2 つしかないフローは、x 軸の途中で終了し、x-max では終了しません (私のおもちゃではないサンキー ダイアグラムでは、これは左揃えですが、違いはわかりません)
  • ノードのみ (リンクではなく) のホバーテキストを削除します。「ラベル」、「テキスト」、「値」、「パーセント」、「名前」を「+」OR「すべて」または「なし」または「スキップ」で結合してさまざまな組み合わせを試しましたが、どれもうまくいかなかったようです違い。
  • たとえば、NA を使用してドロップオフに注意してください。SA からドロップ (青色のノード) へのリンクは表示したくありませんが、x=-1 に緑色のバーを表示して、1 人が SA に移動したことを示したいと考えています。初めての休暇で、次の休暇はありません。(source=SA と target=NA のままにすると、グラフは空白になります)。私が提案する回避策は、DROP Node と SA-DROP リンクの色を白にすることです...

必要な変更を青色で行って、画像に注釈を付けました。 注釈付きサンキー ダイアグラム

require(dplyr); require(plotly); require(RColorBrewer); require(stringr)

# Summarise flow data
dat <- data.frame(customer = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 5),
              holiday_loc = c("SA", "SA", "AB", "SA", "SA", "SA", "SA", "AB", "AB", "SA", "SA", "SA")) %>%
  group_by(customer) %>%
          mutate(holiday_num = seq_along(customer), 
                 source=paste0(holiday_loc, '_', holiday_num), 
                 target = lead(source),
                 last_hol = ifelse(holiday_num == n(), 'Y', 'N')) %>%
  filter(last_hol== 'N'| holiday_num == 1) %>%
  select(-last_hol)

 sank_links <-  dat %>%
   group_by(source, target) %>%
   summarise(n=n()) %>%
   mutate(target=ifelse(is.na(target), "DROP", target)) # is there another option here?

# obtain colours for nodes
f <- function(pal) brewer.pal(brewer.pal.info[pal, "maxcolors"], pal)
cols <- f("Set1")

# set up nodes
sank_nodes <- data.frame(
                      name = factor(sort(unique(c(as.character(sank_links$source), 
                                   as.character(sank_links$target)))))
                      ) %>%    
                        mutate(label=sub("_[0-9]$", "", name), 
                              # for some unknown reason, plotly allows only three labels to be the same
                              label_pad=sub("_[1-3]$", "", name),
                              label_pad=sub("_[4-6]$", " ", label_pad)) %>%
                        arrange(label) %>%
                        mutate(color = cols[cumsum(1-duplicated(label))])

# update links to get index of node and name (without holiday_num)
sank_links <- sank_links %>%
          mutate(source_num = match(source, sank_nodes$name) -1 , 
                 source_name = str_replace(source, "_[0-9]$", ""),
                 target_num = match(target, sank_nodes$name) - 1,
                 target_name = str_replace(target, "_[0-9]$", ""))


# diagram
p <- plot_ly(
  type = "sankey",
  domain = c(
    x =  c(0,1),
    y =  c(0,1)
  ),
  orientation = "h",
  valueformat = ".0f",
  valuesuffix = "Customers",
  arrangement="fixed",


  node = list(
    label = sank_nodes$label_pad,
    color = sank_nodes$color,
    pad = 15,
    thickness = 15,
    line = list(
      color = "black",
      width = 0.5
    )
  ),

  link = list(
    source = sank_links$source_num,
    target = sank_links$target_num,
    value =  sank_links$n
  )
) %>% 
  layout(
    title = "",
    font = list(
      size = 10
    ),
    xaxis = list(showgrid = F, zeroline = F),
    yaxis = list(showgrid = F, zeroline = F)
  )

p

編集:最初は、ノードに対応するブレークでx軸にラベルを付け、x軸にタイトルを付ける方法がわかりませんでした。コードは次のとおりです。

    %>% 
  layout(
    title = "",
    font = list(
      size = 10
    ),
    xaxis = list(showgrid = F, zeroline = F, title="Holiday Number", tickvals=-1:4, ticktext=1:6),
    yaxis = list(showgrid = F, zeroline = F, showticklabels=FALSE)
  )

ソース: https://plot.ly/r/reference/#layout-xaxis-tickformat

4

3 に答える 3