我有一些我正在使用的代码:
这些是创建堆积条形图的痕迹。现在我正在寻找一种方法让这些痕迹是动态的,这取决于由下拉菜单提供的变量。
问题在于下拉菜单中的每个选项都不需要所有跟踪。例如,选择A没有“住宅”的值,这给了我一个错误。
pv = pd.pivot_table(
df_plot,
index=['Year'],
columns=["Market segment"],
values=['Value'],
aggfunc=sum,
fill_value=0)
trace1 = go.Bar(x=pv.index, y=pv[("Value", "Residential")], name="Residential")
trace2 = go.Bar(x=pv.index, y=pv[("Value", "Business – small")], name="Business – small")
trace3 = go.Bar(x=pv.index, y=pv[("Value", "Business – medium")], name="Business - medium")
trace4 = go.Bar(x=pv.index, y=pv[("Value", "Business – micro")], name="Business - micro")
trace5 = go.Bar(x=pv.index, y=pv[("Value", "Business – SME")], name="Business - SME")
trace6 = go.Bar(x=pv.index, y=pv[("Value", "Business")], name="Business")
return {
'data': [trace1, trace2, trace3, trace4, trace5, trace6],
'layout':
go.Layout(
title='Metric: {}'.format(Metric),
barmode='stack')
}
答案 0 :(得分:2)
您只需在准备跟踪时添加if条件,并实际检查数据透视表中是否有数据。如果没有数据,我们为跟踪分配一个空对象,请参考下面的最小工作示例,如果这样可以解决您的问题,请告诉我!
import pandas as pd
import plotly.offline as py_offline
import plotly.graph_objs as go
py_offline.init_notebook_mode()
df_plot = df = pd.DataFrame([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]], columns=["A", "B", "C"])
pv = pd.pivot_table(
df_plot,
index=['A'],
columns=["B"],
values=['C'],
aggfunc=sum,
fill_value=0)
if 2 in list(pv.columns.levels[1]):
trace1 = go.Bar(x=pv.index, y=pv[("C", 2)], name="Two")
else:
trace1 = {}
if 5 in list(pv.columns.levels[1]):
trace2 = go.Bar(x=pv.index, y=pv[("C", 5)], name="Five")
else:
trace2 = {}
py_offline.iplot({
'data': [trace1, trace2],
'layout':
go.Layout(
barmode='stack')
})
其他详情:
以下数据透视表代码的结果是。
pv = pd.pivot_table(
df_plot,
index=['A'],
columns=["B"],
values=['C'],
aggfunc=sum,
fill_value=0)
因此,当您执行pv.columns
时,我们会获得数据透视表中所有单独列的详细信息,如下所示。
pv.columns
MultiIndex(levels = [['C'],[2,4,6,8]], labels = [[0,0,0,0],[0,1,2,3]], names = [None,'B'])
你可以简单地创建一个for循环来循环遍历参数列表数组并应用上一个例子中解释的if condition
验证并最终绘制它,请参考下面的代码并让我知道是否有任何的问题。
import pandas as pd
import plotly.offline as py_offline
import plotly.graph_objs as go
py_offline.init_notebook_mode()
df_plot = df = pd.DataFrame([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]], columns=["A", "B", "C"])
pv = pd.pivot_table(
df_plot,
index=['A'],
columns=["B"],
values=['C'],
aggfunc=sum,
fill_value=0)
arr = []
params = [{'name': "Two", 'val': 2},{'name': "Five", 'val': 5}]
for param in params:
if param['val'] in list(pv.columns.levels[1]):
temp = go.Bar(x=pv.index, y=pv[("C", param['val'])], name=param['name'])
else:
temp = {}
arr.append(temp)
py_offline.iplot({
'data': arr,
'layout':
go.Layout(
barmode='stack')
})