带pandas或python的Sankey条形图图表
我想制作一个类似于此的条形图,其中包含可以与matplotlib接口的任何python模块: 下面是一个示例数据,并解释了我目前可以做的事情:带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
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()
有一个可用的。