Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带pandas或python的Sankey条形图图表_Python_Pandas_Matplotlib_Bar Chart_Sankey Diagram - Fatal编程技术网

带pandas或python的Sankey条形图图表

带pandas或python的Sankey条形图图表,python,pandas,matplotlib,bar-chart,sankey-diagram,Python,Pandas,Matplotlib,Bar Chart,Sankey Diagram,我想制作一个类似于此的条形图,其中包含可以与matplotlib接口的任何python模块: 下面是一个示例数据,并解释了我目前可以做的事情: import pandas from io import StringIO text=""" Name 1980 1982 A Administration Budget B

我想制作一个类似于此的条形图,其中包含可以与matplotlib接口的任何python模块:

下面是一个示例数据,并解释了我目前可以做的事情:

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

然而,我不知道如何绘制条形图各部分之间的流程。有人知道怎么做吗?

您可以使用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()

有一个可用的。