Я думаю, что в вашем случае диаграммы Санки будут лучшим выбором. Предположим, у вас есть data
структура, которая хранит информацию о ваших группах отсюда: 'progression': <group_1>|<group_2>|...|<group_n>
. Тогда вы можете построить диаграмму Санки так:
data = [
[1,2,3,1,4],
[1,4,2],
[1,2,5,3,5],
[1,3],
[1,4,5,1,4,3],
[1,5,4,3],
[1,2,5,1,3,4],
[1,5],
[1,2,1,1,5,2],
[1,5,4,3],
[1,1,2,3,4,1]
]
# Append _1, _2... indices to differ paths like 1-2-2-1 and 1-2-1-2
nodes = sorted(list(set(itertools.chain(*[[str(e) + '_' + str(i) for i, e in enumerate(l)] for l in data]))))
countered = defaultdict(int)
for line in data:
for i in range(len(line) - 1):
countered[(str(line[i]) + '_' + str(i), str(line[i+1]) + '_' + str(i+1))] += 1
links = [
{'source': key[0], 'target': key[1], 'value': value}
for key, value in countered.items()
]
links = {
'source': [nodes.index(key[0]) for key, value in countered.items()],
'target': [nodes.index(key[1]) for key, value in countered.items()],
'value': [value for key, value in countered.items()]
}
data_trace = dict(
type='sankey',
domain = dict(
x = [0,1],
y = [0,1]
),
orientation = "h",
valueformat = ".0f",
node = dict(
pad = 10,
thickness = 30,
line = dict(
color = "black",
width = 0
),
label = nodes
),
link = links
)
layout = dict(
title = "___",
height = 772,
font = dict(
size = 10
),
)
fig = dict(data=[data_trace], layout=layout)
iplot(fig, validate=True)
Он нарисует вам сюжет Санки так:
Вы можете найти больше информации о том, как Санки работает в сюжете здесь .