Проблема с несколькими участками Sankey в Plotly - PullRequest
0 голосов
/ 30 марта 2019

Так что я застрял, пытаясь создать график с несколькими диаграммами Санки.В частности, я получаю сообщение об ошибке "Недопустимое свойство, указанное для объекта типа plotly.graph_objs.Sankey: 'xaxis'" .Похоже, это вызывается, когда скрипт получает команду append_trace .Вот простой пример кода, который я запускаю в записной книжке Jupyter:

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", "Kazakhstan", "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]
    )
)

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

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

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

offline.iplot(fig)

Когда я запускаю его, я получаю следующую трассировку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-dd6268edf7ab> in <module>
     37 fig = tools.make_subplots(rows = 2, cols = 1)
     38 
---> 39 fig.append_trace(trace1, 1, 1)
     40 fig.append_trace(trace2, 2, 1)
     41 

/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'

Я НЕ задаю xaxis в моих следах, так откуда, черт возьми, это происходит?Похоже, эта часть может иметь к этому какое-то отношение:

/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

Это ошибка?Понятия не имею.

Кто-нибудь, помогите!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Я добавил этот вопрос на форумах сообщества Plotly здесь и получил ответ, который решил его (в основном).Я скопирую ответ, чтобы он сохранился, даже если ссылка не работает.

Проблема, с которой вы столкнулись, заключается в том, что make_subplots и append_trace только работают для декартовых типов следов прямо сейчас.Это то, что мы планируем улучшить для версии 4, но пока лучший способ - указать позицию каждой трассы sankey отдельно, используя свойство домена.

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)

два вспомогательных сюжета рядом:

горизонтальные сюжеты Санки

Вместо указания «x» в домене мы можем указать «y» для позиционирования субплотов по вертикали.

Это хороший хак, без встроенной поддержки для сюжетов Sankey.Единственным недостатком является то, что я не вижу, как можно указать отдельные заголовки для подзаговоров.

0 голосов
/ 03 апреля 2019

Попробуйте таким образом без операции добавления:

Добавьте это к определению обеих трасс.

type='sankey',

Определите два подзаговора как массив данных.

data = Data([trace1, trace2])

Define fig:

fig = dict(data=[data], layout=layout)
py.iplot(fig, validate=False)

Наконец, вам нужно добавить определение вашего макета, используя словарь, как показано в моем посте, на который есть ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...