[英]Plotly-Dash: Want two stacked bar charts side by side from single df column
I am trying to get two stacked bar charts side by side but cannot figure it out.我正在尝试并排放置两个堆叠的条形图,但无法弄清楚。
Here's an example df:这是一个示例 df:
Field Issue
Police Budget cuts
Research Budget cuts
Police Time consuming
Banking Lack of oversight
Healthcare Lack of support
Research Bureaucracy
Healthcare Bureaucracy
Banking Mistrust
What I want is a stacked bar chart of of field first.我首先要的是场的堆积条形图。 It will have a height of 8 broken down by 2 police, 2 x research etc. Then I want a stacked bar chart of Issue next to the first chart.
它的高度为 8,由 2 个警察、2 个研究等细分。然后我想要第一个图表旁边的问题堆积条形图。 This second one will have a height of 8 and be stacked by 2 x budget cuts, 1 x time consuming, 1 x lack of oversight etc.
第二个将有 8 的高度,并被 2 次预算削减、1 次耗时、1 次缺乏监督等叠加。
I have tried:我试过了:
to get the stacked bar chart of all fields:获取所有字段的堆积条形图:
trace1 = go.Bar(
x = df.Field.unique(),
y = df.Field.value_counts(),
name='Total Amount of roles'
)
to get a stacked bar chart of Budget cuts (then replicate for other issues):获得预算削减的堆积条形图(然后复制其他问题):
trace2 = go.Bar(
x = df.Field.unique(),
y = df[df['Issue'] == 'Budget cuts'].Field.value_counts(),
name='Budget cuts'
)
data = [trace1, trace2]
layout = go.Layout(barmode='stack')
fig = go.Figure(data=data, layout=layout)
py.plot(fig, filename='test.html')
But the above code stacks the two graphs onto one.但是上面的代码将两个图叠加到一个上。 I want trace 1 stacked and trace 2 stacked.
我想要堆叠跟踪 1 和堆叠跟踪 2。 I also want this integrated into Dash and not plotly on it's own but that would be secondary to be honest.
我也希望将其集成到 Dash 中,而不是单独策划,但老实说,这将是次要的。 Would appreciate any help!
将不胜感激任何帮助!
EDIT - after a short dialouge in the comments, this is my latest suggestion:编辑 - 在评论中进行简短对话后,这是我的最新建议:
Here's a possible solution with the count of each ocurence of each category stacked per column ( Field or Issue):这是一个可能的解决方案,其中包含每列堆叠的每个类别的每个出现次数(字段或问题):
Plot:阴谋:
Code:代码:
As you can see it's not very flexible since you'll have to add one go.Bar
object for each category (Banking, Police etc).正如您所看到的,它不是很灵活,因为您必须为每个类别(银行、警察等)添加一个
go.Bar
对象。 But if the plot above is what you're looking for, I'll sort out that part too.但如果上面的情节是你要找的,我也会整理出那部分。
# import
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)
#%qtconsole
# sample data
Field = ['Police', 'Research', 'Police', 'Banking', 'Healthcare', 'Research', 'Healthcare', 'Banking']
Issue = ['Budget cuts', 'Budget cuts', 'Time consuming', 'Lack of oversight', 'Lack of support', 'Bureaucracy', 'Bureaucracy', 'Mistrust']
# Put the lists in a pandas dataframe for
# easy grouping and indexing
df = pd.DataFrame([Field, Issue]).T
df.columns = ['Field', 'Issue']
grField = df.groupby('Field').count()
grIssue = df.groupby('Issue').count()
dfgr = pd.concat([grField, grIssue], axis = 1, sort = False)
dfgr = dfgr.T
# Make one go.Bar() object for each category
# for corresponing Field / Issue
trace1 = go.Bar(
x = ['Issue'],
#y = [dfgr['Field']],
y = [dfgr['Banking'].loc['Issue']],
name='Banking')
trace2 = go.Bar(
x = ['Issue'],
#y = [dfgr['Field']],
y = [dfgr['Healthcare'].loc['Issue']],
name='Healthcare')
trace3 = go.Bar(
x = ['Issue'],
#y = [dfgr['Field']],
y = [dfgr['Police'].loc['Issue']],
name='Police')
trace4 = go.Bar(
x = ['Issue'],
#y = [dfgr['Field']],
y = [dfgr['Research'].loc['Issue']],
name='Research')
trace5 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Budget cuts'].loc['Field']],
name='Budget cuts')
trace6 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Bureaucracy'].loc['Field']],
name='Bureaucracy')
trace7 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Lack of oversight'].loc['Field']],
name='Lack of oversight')
trace7 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Lack of oversight'].loc['Field']],
name='Lack of oversight')
trace8 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Lack of support'].loc['Field']],
name='Lack of support')
trace9 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Mistrust'].loc['Field']],
name='Mistrust')
trace10 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Time consuming'].loc['Field']],
name='Time consuming')
# gather data and set up layout
#data = [trace1, trace2, trace3, trace4, trace5, trace6, trace7, trace8, trace9, trace10]
data = [trace10, trace9, trace8, trace7, trace6, trace5, trace4, trace3, trace2, trace1]
layout = go.Layout(barmode='stack', title = 'Stacked bar chart from single column')
# Build figure
fig = go.Figure(data=data, layout=layout)
# PLot figure
iplot(fig, filename='test.html')
Snippets of working code, in case this is what you need:工作代码片段,以防万一这是您需要的:
import plotly.graph_objects as go
x=['a','b','c','d']
fig = go.Figure(go.Bar(x =x, y=[2,5,1,9], name='Montreal',
base = 0, width = 0.2, offset = 0.0,
marker = dict(color = 'rgb(0,120,255)')))
fig.add_trace(go.Bar(x=x, y=[1, 4, 9, 16], name='Ottawa',
width = 0.2, offset = -0.2,
marker = dict(color = 'rgb(250,60,0)')))
fig.add_trace(go.Bar(x=x, y=[6, 8, 4.5, 8], name='Toronto',
width = 0.2, offset = -0.2,
marker = dict(color = 'rgb(250,130,0)')))
fig.update_layout(barmode='stack', xaxis={'categoryorder':'array', 'categoryarray':['d','a','c','b']})
fig.show()
an alternate layout: change: base,offset of second figure
替代布局:
change: base,offset of second figure
import plotly.graph_objects as go
x=['a','b','c','d']
fig = go.Figure(go.Bar(x =x, y=[2,5,1,9], name='Montreal',
base = 0, width = 0.2, offset = 0.0,
marker = dict(color = 'rgb(0,120,255)')))
fig.add_trace(go.Bar(x=x, y=[1, 4, 9, 16], name='Ottawa',
width = 0.2, offset = -0.4, base=0,
marker = dict(color = 'rgb(250,60,0)')))
fig.add_trace(go.Bar(x=x, y=[6, 8, 4.5, 8], name='Toronto',
width = 0.2, offset = -0.2,
marker = dict(color = 'rgb(250,130,0)')))
fig.update_layout(barmode='stack', xaxis={'categoryorder':'array', 'categoryarray':['d','a','c','b']})
fig.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.