Python 3.x Plotly中存在多个Sankey子批次的问题
所以我一直在尝试创建一个包含多个Sankey图表的绘图。具体地说,我一直收到一个错误,上面写着“为plotly.graph_objs.Sankey类型的对象指定的属性无效:'xaxis'”。这似乎是在脚本到达append\u trace命令时调用的。下面是一个简单的示例代码,我在Jupyter笔记本中运行该代码:Python 3.x Plotly中存在多个Sankey子批次的问题,python-3.x,plotly-python,Python 3.x,Plotly Python,所以我一直在尝试创建一个包含多个Sankey图表的绘图。具体地说,我一直收到一个错误,上面写着“为plotly.graph_objs.Sankey类型的对象指定的属性无效:'xaxis'”。这似乎是在脚本到达append\u trace命令时调用的。下面是一个简单的示例代码,我在Jupyter笔记本中运行该代码: import plotly.tools as tools import plotly.offline as offline import plotly.graph_objs as go
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'
这是虫子吗?我不知道
谁来帮忙 尝试不附加操作:
将此添加到两条记录道的定义中
type='sankey',
将两个子地块定义为数据数组
data = Data([trace1, trace2])
定义图:
fig = dict(data=[data], layout=layout)
py.iplot(fig, validate=False)
最后,您需要使用字典添加布局的定义,如我的参考帖子所示。我在Plotly社区论坛上交叉发布了这个问题,并收到了一个答案(大部分)解决了这个问题。我将把答案复制到这里,这样即使链接失效也能保存下来
您遇到的问题是,make_子图和append_跟踪目前仅适用于笛卡尔跟踪类型。这是我们计划为版本4改进的内容,但同时,最好的方法是使用domain属性分别指定每个sankey跟踪的位置
这将同时生成两个子批次:
我们可以指定“y”来垂直定位子批次,而不是在域中指定“x”
这是一个很好的破解,缺少对Sankey子地块的内置支持。唯一的缺点是我看不出如何为子地块指定单个标题。我的回答解决了您的问题吗?如果有,请接受并投票:有什么好方法可以为每个子地块获得标题?这将导致两个子地块重叠。去掉圆括号,这样就可以了。
fig = dict(data=[data], layout=layout)
py.iplot(fig, validate=False)
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)