Это может показаться очень широким вопросом, но если вы позволите мне описать некоторые детали, я могу заверить вас, что это очень конкретный. А также обескураживает, расстраивает и вызывает гнев.
Следующий график описывает шотландские выборы и основан на коде из plot.ly < / а>:
Сюжет 1:
Набор данных 1:
data = [['Source','Target','Value','Color','Node, Label','Link Color'],
[0,5,20,'#F27420','Remain+No – 28','rgba(253, 227, 212, 0.5)'],
[0,6,3,'#4994CE','Leave+No – 16','rgba(242, 116, 32, 1)'],
[0,7,5,'#FABC13','Remain+Yes – 21','rgba(253, 227, 212, 0.5)'],
[1,5,14,'#7FC241','Leave+Yes – 14','rgba(219, 233, 246, 0.5)'],
[1,6,1,'#D3D3D3','Didn’t vote in at least one referendum – 21','rgba(73, 148, 206, 1)'],
[1,7,1,'#8A5988','46 – No','rgba(219, 233, 246,0.5)'],
[2,5,3,'#449E9E','39 – Yes','rgba(250, 188, 19, 1)'],
[2,6,17,'#D3D3D3','14 – Don’t know / would not vote','rgba(250, 188, 19, 0.5)'],
[2,7,2,'','','rgba(250, 188, 19, 0.5)'],
[3,5,3,'','','rgba(127, 194, 65, 1)'],
[3,6,9,'','','rgba(127, 194, 65, 0.5)'],
[3,7,2,'','','rgba(127, 194, 65, 0.5)'],
[4,5,5,'','','rgba(211, 211, 211, 0.5)'],
[4,6,9,'','','rgba(211, 211, 211, 0.5)'],
[4,7,8,'','','rgba(211, 211, 211, 0.5)']
]
Как построен сюжет:
Я собрал некоторые важные детали о поведении графиков Санки из различных источников, например:
Санки автоматически упорядочивает категории, чтобы минимизировать количество перекрытие
Ссылки назначаются в порядке их появления в наборе данных (row_wise)
Проблема:
Как вы увидите в деталях ниже, узлы, метки и цвета не применяются к диаграмме в том же порядке, что и исходный фрейм данных. Некоторые из этого имеют идеальный смысл, поскольку у вас есть различные элементы, описывающие один и тот же узел, такие как цвет, цели, значения и цвет ссылки. Один узел 'Remain+No – 28'
выглядит так:
И сопутствующая часть набора данных выглядит так:
[0,5,20,'#F27420','Remain+No – 28','rgba(253, 227, 212, 0.5)'],
[0,6,3,'#4994CE','Leave+No – 16','rgba(242, 116, 32, 1)'],
[0,7,5,'#FABC13','Remain+Yes – 21','rgba(253, 227, 212, 0.5)'],
Итак, эта часть источника описывает узел [0]
с тремя соответствующими целями [5, 6, 7]
и тремя ссылками со значениями [20, 3, 5]
. '#F27420'
- оранжевый (ish) цвет узла, а цвета 'rgba(253, 227, 212, 0.5)'
, 'rgba(242, 116, 32, 1)'
и 'rgba(253, 227, 212, 0.5)'
описывают цвета ссылок от узла к некоторым целям. Пока что не использовалась информация из приведенного выше примера:
Пример данных 2 (частичный)
[-,-,--'-------','---------------','-------------------'],
[-,-,-,'#4994CE','Leave+No – 16','-------------------'],
[-,-,-,'#FABC13','Remain+Yes – 21','-------------------'],
И эта информация используется при отображении остальных элементов диаграммы.
Итак, в чем вопрос? В дальнейших деталях ниже вы увидите, что все имеет смысл, пока новая строка данных в наборе данных вставляет новую ссылку и вносит другие изменения в другие элементы (цвета, метки), если эта информация еще не использовалась. . Я буду еще более конкретен, используя два скриншота из настройки, которую я сделал с сюжетом слева и кодом справа:
Следующий образец данных создает диаграмму ниже, следуя логике, описанной выше:
Пример данных 3
data = [['Source','Target','Value','Color','Node, Label','Link Color'],
[0,5,20,'#F27420','Remain+No – 28','rgba(253, 227, 212, 0.5)'],
[0,6,3,'#4994CE','Leave+No – 16','rgba(242, 116, 32, 1)'],
[0,7,5,'#FABC13','Remain+Yes – 21','rgba(253, 227, 212, 0.5)'],
[1,5,14,'#7FC241','Leave+Yes – 14','rgba(219, 233, 246, 0.5)'],
[1,6,1,'#D3D3D3','Didn’t vote in at least one referendum – 21','rgba(73, 148, 206, 1)']]
Снимок экрана 1. Частичный график с образцом данных 3
ВОПРОС:
Добавление строки [1,7,1,'#8A5988','46 – No','rgba(219, 233, 246,0.5)']
в набор данных создает новую связь между источником [5]
и целью [7]
, но одновременно применяет цвет и метку к цели 5. Я думаю, что следующий ярлык, который будет применен к диаграмме, будет 'Remain+Yes – 21'
, поскольку он не использовался. Но вот что происходит: метка '46 – No'
применяется к цели 5. ПОЧЕМУ?
Снимок экрана 2. Частичный график с образцом данных 3 + [1,7,1,'#8A5988','46 – No','rgba(219, 233, 246,0.5)']
:
И как определить, что является источником, а что целью, на основе этого фрейма данных?
Я знаю, что это странный вопрос, на который сложно ответить, но я надеюсь, что у кого-то есть предложение. Я также знаю, что фрейм данных может быть не лучшим источником для диаграммы Sankey. Может быть, вместо этого json?
Полный код и образец данных для простого копирования и вставки в блокнот Jupyter:
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
# Original data
data = [['Source','Target','Value','Color','Node, Label','Link Color'],
[0,5,20,'#F27420','Remain+No – 28','rgba(253, 227, 212, 0.5)'],
[0,6,3,'#4994CE','Leave+No – 16','rgba(242, 116, 32, 1)'],
[0,7,5,'#FABC13','Remain+Yes – 21','rgba(253, 227, 212, 0.5)'],
[1,5,14,'#7FC241','Leave+Yes – 14','rgba(219, 233, 246, 0.5)'],
[1,6,1,'#D3D3D3','Didn’t vote in at least one referendum – 21','rgba(73, 148, 206, 1)'],
[1,7,1,'#8A5988','46 – No','rgba(219, 233, 246,0.5)'],
[2,5,3,'#449E9E','39 – Yes','rgba(250, 188, 19, 1)'],
[2,6,17,'#D3D3D3','14 – Don’t know / would not vote','rgba(250, 188, 19, 0.5)'],
[2,7,2,'','','rgba(250, 188, 19, 0.5)'],
[3,5,3,'','','rgba(127, 194, 65, 1)'],
[3,6,9,'','','rgba(127, 194, 65, 0.5)'],
[3,7,2,'','','rgba(127, 194, 65, 0.5)'],
[4,5,5,'','','rgba(211, 211, 211, 0.5)'],
[4,6,9,'','','rgba(211, 211, 211, 0.5)'],
[4,7,8,'','','rgba(211, 211, 211, 0.5)']
]
headers = data.pop(0)
df = pd.DataFrame(data, columns = headers)
scottish_df = df
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 = scottish_df['Node, Label'].dropna(axis=0, how='any'),
color = scottish_df['Color']
),
link = dict(
source = scottish_df['Source'].dropna(axis=0, how='any'),
target = scottish_df['Target'].dropna(axis=0, how='any'),
value = scottish_df['Value'].dropna(axis=0, how='any'),
color = scottish_df['Link Color'].dropna(axis=0, how='any'),
)
)
layout = dict(
title = "Scottish Referendum Voters who now want Independence",
height = 772,
font = dict(
size = 10
),
)
fig = dict(data=[data_trace], layout=layout)
iplot(fig, validate=False)