plotly.py icon indicating copy to clipboard operation
plotly.py copied to clipboard

Sankey node x and y positions require both variables set to reflect in chart.

Open devin-moonrise opened this issue 6 years ago • 5 comments

This is somewhat of a duplicate of #960 and #1437 but slightly more hopeful :) The x and y arguments of the nodes dict do successfully control node location, however -- it appears that both arguments must be supplied.

import dash
import dash_core_components as dcc
import dash_html_components as html
f#rom dash.dependencies import Output, Input, State
import plotly.graph_objs as go
#import pandas as pd

app = dash.Dash()
app.layout = html.Div([
    dcc.Graph(
        id = 'wut',
        figure={
            'data' : [
                dict(
                    type='sankey',
                    #domain = 
                    arrangement = 'fixed',
                        node = dict(
                            pad = 15,
                            thickness = 20,
                            line = dict(color = "black", width = 0.5),
                            label = ["A1", "A2", "B1", "B2", "C1", "C2"],
                            x = [0.1, 0.2, 0.24, 0.7, 0.8, .9],
                            y = [0, .2, .3, .4, .5, .6],
                            color = "blue"
                    ),
            link = dict(
                source = [0, 1, 0, 2, 3, 3], # indices correspond to labels, eg A1, A2, A2, B1, ...
                target = [2, 3, 3, 4, 4, 5],
                value = [8, 4, 2, 8, 4, 2]
            ))        
        ]}   
)])

if __name__ == '__main__':
    app.run_server(debug=True)

VS.

import dash
import dash_core_components as dcc
import dash_html_components as html
f#rom dash.dependencies import Output, Input, State
import plotly.graph_objs as go
#import pandas as pd

app = dash.Dash()
app.layout = html.Div([
    dcc.Graph(
        id = 'wut',
        figure={
            'data' : [
                dict(
                    type='sankey',
                    #domain = 
                    arrangement = 'fixed',
                        node = dict(
                            pad = 15,
                            thickness = 20,
                            line = dict(color = "black", width = 0.5),
                            label = ["A1", "A2", "B1", "B2", "C1", "C2"],
                            ###x = [0.1, 0.2, 0.24, 0.7, 0.8, .9],
                            y = [0, .2, .3, .4, .5, .6],
                            color = "blue"
                    ),
            link = dict(
                source = [0, 1, 0, 2, 3, 3], # indices correspond to labels, eg A1, A2, A2, B1, ...
                target = [2, 3, 3, 4, 4, 5],
                value = [8, 4, 2, 8, 4, 2]
            ))        
        ]}   
)])

if __name__ == '__main__':
    app.run_server(debug=True)

devin-moonrise avatar Aug 20 '19 19:08 devin-moonrise

+1 for the possibility to define x coordinates only.

johentsch avatar Jan 29 '20 09:01 johentsch

That would still be a super helpful feature!

1kastner avatar Sep 28 '21 07:09 1kastner

Is there a way to at least obtain the nodes position after the chart creation?

This way, a workaround could be:

  • let the nodes positions be the default ones
  • get these positions
  • modifiy the positions a posteriori

RemDelaporteMathurin avatar Nov 23 '21 07:11 RemDelaporteMathurin

Is there a way to at least obtain the nodes position after the chart creation?

This way, a workaround could be:

  • let the nodes positions be the default ones
  • get these positions
  • modifiy the positions a posteriori

That would still be helpful or has this been done?

steffi1mb avatar Aug 03 '22 09:08 steffi1mb

That would indeed be a helpful workaround, haven't found a way to retrieve coordinates so far, anyone else?

johentsch avatar Aug 03 '22 11:08 johentsch

I'm also trying to get the node positions, but to no avail. The choice between 'freeform', 'fixed', and 'snap' doesn't seem to matter for this.

janscholten avatar Feb 02 '23 10:02 janscholten