plotly / plotly.py

The interactive graphing library for Python :sparkles: This project now includes Plotly Express!
https://plotly.com/python/
MIT License
15.66k stars 2.51k forks source link

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

Open devin-moonrise opened 4 years ago

devin-moonrise commented 4 years ago

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)
johentsch commented 4 years ago

+1 for the possibility to define x coordinates only.

1kastner commented 2 years ago

That would still be a super helpful feature!

RemDelaporteMathurin commented 2 years ago

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

This way, a workaround could be:

steffi1mb commented 1 year ago

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?

johentsch commented 1 year ago

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

janscholten commented 1 year ago

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.