Invalid property specified for object of type plotly.graph_objs.Sankey: 'xaxis'

So I’m stuck trying to create a plot with multiple Sankey diagrams. Specifically, I keep getting an error that says “Invalid property specified for object of type plotly.graph_objs.Sankey: ‘xaxis’”. This seems to be invoked when the script gets to the append_trace command. Here is a simple example code:

import plotly.tools as tools
import plotly.offline as offline
import plotly.graph_objs as go

offline.init_notebook_mode(connected = True)

trace1 = go.Sankey(
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(
            color = "black",
            width = 0.5
        ),
        label = ["Joe", "Molly", "Gavin", "Octavio", "Leslie", "Natasha"],
        color = ["blue", "red", "green", "yellow", "brown", "magenta"]
    ),
    link = dict(
        source = [0,1,3],
        target = [5,5,0],
        value = [6,8,3]
    )
)

trace2 = go.Sankey(
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(
            color = "black",
            width = 0.5
        ),
        label = ["Russia", "Gambia", "Sweden", "Bolivia", "Timor-Leste", "Canada", "Bhutan"],
        color = ["red", "black", "brown", "magenta", "yellow", "blue", "orange"]
    ),
    link = dict(
        source = [0,1,4,6],
        target = [7,7,7,3],
        value = [6,8,3,3]
    )
)

data = [trace1, trace2]

layout =  go.Layout(
    title = "Basic Sankey Diagram",
    font = dict(
      size = 10
    )
)

fig = tools.make_subplots(rows = 2, cols = 1)

fig.append_trace(trace1, 1, 1)
fig.append_trace(trace2, 1, 2)

fig['layout'].update(
    title = "Basic Sankey Diagram with Two Subplots",
    font = dict(
      size = 10
    )
)

offline.iplot(fig)

When I run it, I get the following traceback:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-16-682a06045660> in <module>
     46 fig = tools.make_subplots(rows = 2, cols = 1)
     47 
---> 48 fig.append_trace(trace1, 1, 1)
     49 fig.append_trace(trace2, 1, 2)
     50 

/anaconda3/lib/python3.7/site-packages/plotly/basedatatypes.py in append_trace(self, trace, row, col)
   1222 """, DeprecationWarning)
   1223 
-> 1224         self.add_trace(trace=trace, row=row, col=col)
   1225 
   1226     def _set_trace_grid_position(self, trace, row, col):

/anaconda3/lib/python3.7/site-packages/plotly/basedatatypes.py in add_trace(self, trace, row, col)
   1069         return self.add_traces(data=[trace],
   1070                                rows=[row] if row is not None else None,
-> 1071                                cols=[col] if col is not None else None
   1072                                )[0]
   1073 

/anaconda3/lib/python3.7/site-packages/plotly/basedatatypes.py in add_traces(self, data, rows, cols)
   1152         if rows is not None:
   1153             for trace, row, col in zip(data, rows, cols):
-> 1154                 self._set_trace_grid_position(trace, row, col)
   1155 
   1156         # Make deep copy of trace data (Optimize later if needed)

/anaconda3/lib/python3.7/site-packages/plotly/basedatatypes.py in _set_trace_grid_position(self, trace, row, col)
   1259                                 "An axis object for ({r},{c}) subplot "
   1260                                 "cell got deleted.".format(r=row, c=col))
-> 1261             trace['xaxis'] = ref[0]
   1262             trace['yaxis'] = ref[1]
   1263 

/anaconda3/lib/python3.7/site-packages/plotly/basedatatypes.py in __setitem__(self, prop, value)
   2823             # ### Validate prop ###
   2824             if prop not in self._validators:
-> 2825                 self._raise_on_invalid_property_error(prop)
   2826 
   2827             # ### Get validator for this property ###

/anaconda3/lib/python3.7/site-packages/plotly/basedatatypes.py in _raise_on_invalid_property_error(self, *args)
   3006                                  full_obj_name=full_obj_name,
   3007                                  invalid_str=invalid_str,
-> 3008                                  prop_descriptions=self._prop_descriptions))
   3009 
   3010     def update(self, dict1=None, **kwargs):

ValueError: Invalid property specified for object of type plotly.graph_objs.Sankey: 'xaxis'

I am NOT specifying ‘xaxis’ in my traces, so where the hell is this coming from? Seems like it’s this part:

/anaconda3/lib/python3.7/site-packages/plotly/basedatatypes.py in _set_trace_grid_position(self, trace, row, col)
1259 "An axis object for ({r},{c}) subplot "
1260 “cell got deleted.”.format(r=row, c=col))
-> 1261 trace[‘xaxis’] = ref[0]
1262 trace[‘yaxis’] = ref[1]

Is this a bug? I have no idea.

Somebody help!

Hi @rkarimov,

The trouble you’re running into is that make_subplots and append_trace only work for cartesian trace types right now. This is something we’re planning to improve for version 4, but in the meantime, the best approach is to specify the position of each sankey trace individually using the domain property

import plotly.tools as tools
import plotly.offline as offline
import plotly.graph_objs as go

offline.init_notebook_mode(connected = True)

trace1 = go.Sankey(
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(
            color = "black",
            width = 0.5
        ),
        label = ["Joe", "Molly", "Gavin", "Octavio", "Leslie", "Natasha"],
        color = ["blue", "red", "green", "yellow", "brown", "magenta"]
    ),
    link = dict(
        source = [0,1,3],
        target = [5,5,0],
        value = [6,8,3]
    ),
    domain={
        'x': [0, 0.45]
    }
)

trace2 = go.Sankey(
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(
            color = "black",
            width = 0.5
        ),
        label = ["Russia", "Gambia", "Sweden", "Bolivia", "Timor-Leste", "Canada", "Bhutan"],
        color = ["red", "black", "brown", "magenta", "yellow", "blue", "orange"]
    ),
    link = dict(
        source = [0,1,4,6],
        target = [7,7,7,3],
        value = [6,8,3,3]
    ),
    domain={
        'x': [0.55, 1.0]
    }
)

data = [trace1, trace2]

layout =  go.Layout(
    title = "Basic Sankey Diagram",
    font = dict(
      size = 10
    )
)

fig = go.Figure(data=data, layout=layout)
iplot(fig)

Hope that helps!
-Jon

1 Like

This solves it (well, until version 4 comes out, as you said)! Thank you very much for your answer.

1 Like