plotly / plotly/plotly.py

Sankey node x and y positions ignored if node is empty

オープン
#3,003 コメント 2 件 リアクション 7 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

bug P3
主要言語
Python
スター
18.8k
フォーク
2.8k
平均マージ
16時間 26分
マージ済み PR(30日)
21

説明

Consider the next example

import numpy as np
import plotly.graph_objects as go

def plot_sankey(source, target, value, labels):
    "From <https://plotly.com/python/sankey-diagram/>"
    fig = go.Figure(data=[go.Sankey(
        arrangement = "perpendicular",
        node = dict(
          pad = 15,
          thickness = 20,
          line = dict(color = "black", width = 0.5),
          label = labels,
          color = "red",
        ),
        link = dict(
          source = source, # indices correspond to labels, eg A1, A2, A1, B1, ...
          target = target,
          value = value
        ))])

    return fig


source = np.expand_dims(range(0, 25), axis=1).repeat(5, axis=1).flatten()
target = np.array(range(5, 30)).reshape(5, -1).repeat(5, axis=0).flatten()

value_not_so_sparse = [0, 7, 1, 2, 0, 5, 241, 5, 255, 6, 0, 11, 2, 8, 0, 10, 221, 9, 203, 2, 0, 7, 0, 5, 0, 0, 9, 0, 6, 0, 6, 251, 9, 217, 4, 0, 7, 1, 9, 0, 6, 220, 7, 239, 1, 0, 5, 1, 2, 0, 0, 6, 0, 6, 0, 2, 231, 14, 240, 5, 0, 9, 0, 9, 0, 6, 214, 9, 242, 2, 0, 3, 0, 2, 0, 0, 1, 1, 4, 2, 5, 241, 5, 211, 1, 1, 12, 0, 9, 1, 3, 230, 19, 243, 4, 0, 2, 0, 5, 0, 0, 4, 0, 5, 0, 8, 217, 13, 245, 3, 0, 10, 0, 15, 0, 8, 222, 8, 231, 3, 0, 4, 0, 4, 0]

value_sparse = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 460, 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 129, 3, 0, 0, 0, 103, 242, 115, 0, 0, 0, 18, 126, 122, 0, 0, 0, 0, 0, 140, 2, 0, 0, 0, 106, 116, 10, 0, 0, 0, 64, 124, 75, 0, 0, 0, 6, 118, 117, 0, 0, 0, 1, 121, 242, 4, 0, 0, 0, 96, 82, 4, 0, 0, 0, 38, 65, 37, 0, 0, 0, 9, 87, 98, 0, 0, 0, 4, 234, 333, 5, 0, 0, 0, 58, 62, 4, 0, 0, 0, 15, 36, 27, 0, 0, 0, 3, 75, 50, 0, 0, 0, 13, 319]

labels = []
# because labels could not repeat at different time points
for i in range(6):
    labels.extend([f'{j}_{i}' for j in [1, 2, 3, 4, 5]])

# True
len(source) == len(target) == len(value_not_so_sparse) == len(value_sparse)

Plot sankey where all nodes are present:

fig = plot_sankey(source, target, value_not_so_sparse, labels)
fig.show()

image

Now try to rearrange nodes:

fig.data[0].node.x = np.linspace(1e-09, 1, 6).repeat(5)
fig.data[0].node.y = np.expand_dims(np.linspace(1e-09, 1, 5), axis=1).repeat(6, axis=1).T.flatten()
fig.show()

image

Everything works. Not without crotches (https://github.com/plotly/plotly.py/issues/3002, https://github.com/plotly/plotly.py/issues/1732), but works.

Now try plot where some nodes are missing, but we still want to arrange them:

fig = plot_sankey(source, target, value_sparse, labels)
fig.show()

image

Now arrange should work still because we have the same target, source, labels ans len(values):

fig.data[0].node.x = np.linspace(1e-09, 1, 6).repeat(5)
fig.data[0].node.y = np.expand_dims(np.linspace(1e-09, 1, 5), axis=1).repeat(6, axis=1).T.flatten()
fig.show()

image

It counts only non-empty nodes

Not sure if it is not plotly.js problem

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

value_sparse を使用して Python Sankey の例を実行し、図を表示する前に、表示された node.x 配列と node.y 配列を割り当てます。結果を value_not_so_sparse のケースと比較します。完了条件は、一部のノードに値が 0 のリンクがある場合でも、明示的に配置されたノードが要求された位置に留まることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
numpy, python
領域
data-visualization
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
38/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。