Гистограмма Санки с пандами или питоном

Я хотел бы сделать диаграмму гистограммы, подобную этой, с любым модулем Python, с которым я могу взаимодействовать с matplotlib:

Гистограмма Санки с накоплением

Ниже приведен пример данных и объяснение того, что я могу сделать на данный момент:

import pandas
from io import StringIO

text="""
Name                           1980              1982
A                    Administration            Budget
B                    Administration    Administration
C                    Administration    Administration
D                    Administration            Budget
E                    Administration            Budget
F                    Administration    Administration
G                    Administration    Administration
H                    Administration    Administration
"""

data=pandas.read_fwf(StringIO(text),header=1).set_index("Name")

count=pandas.DataFrame(index=["Administration","Budget"])
for col in data.columns:
    count[col]=data[col].value_counts()

count.T.plot(kind="bar",stacked=True)

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

Линейчатая диаграмма с накоплением

Я также могу получить число людей, перешедших в период с 1980 по 1982 год из административного отдела в бюджетный, выполнив

pandas.crosstab(data["1980"],data["1982"])

который дает:

1982            Administration  Budget
1980                                  
Administration               5       3

Однако я не знаю, как рисовать потоки между каждой частью гистограммы. Кто-нибудь знает, как?


person baloo    schedule 18.09.2017    source источник
comment
Доступен sankey_api.   -  person ImportanceOfBeingErnest    schedule 19.09.2017


Ответы (1)


Вы можете использовать функции pandas: crosstab и Melt для подготовки ваших данных для sankey:

from io import StringIO
import pandas as pd
import plotly
import chart_studio.plotly as py

text = """
Name                           1980              1982
A                    Administration            Budget
B                    Administration    Administration
C                    Administration    Administration
D                    Administration            Budget
E                    Administration            Budget
F                    Administration    Administration
G                    Administration    Administration
H                    Administration    Administration
"""
data = pd.read_fwf(StringIO(text),header=1)

# Make crosstab
data_cross = pd.crosstab(data['1980'], data['1982'])
print(data_cross)

# Make flat table
data_tidy = data_cross.rename_axis(None, axis=1).reset_index().copy()

# Make tidy table
formatted_data = pd.melt(data_tidy,
                         ['1980'],
                         var_name='1982',
                         value_name='Value')

import plotly.graph_objects as go

fig = go.Figure(data=[go.Sankey(
    node = dict(
      pad = 15,
      thickness = 20,
      line = dict(color = "black", width = 0.5),
      label = ["Administration", "Administration", "Budget"],
      color = ['blue', 'blue', 'green']
    ),
    link = dict(
        source = [0, 0], # indices correspond to labels...
        target = [1, 2],
        value = [5, 3],
        color = ['lightblue', 'lightgreen']
  ))])

fig.update_layout(title_text="Basic Sankey Diagram", font_size=10)
fig.show()

Снимок рисунка

person user2081411    schedule 15.10.2019