python - 有没有办法动态创建跟踪,例如堆叠条形图?

标签 python python-3.x plotly plotly-dash

我正在使用一些代码:

这些是创建堆积条形图的轨迹。现在,我正在寻找一种方法,使这些跟踪能够根据下拉菜单提供的变量而动态变化。

问题是下拉菜单中的每个选择并不需要所有跟踪。例如,选择 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')
}

最佳答案

您只需要在准备跟踪时添加 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)

pivot table result

因此,当您执行 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 条件 验证并最终绘制它,请引用下面的代码并告诉我如果有任何问题。

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')
})

关于python - 有没有办法动态创建跟踪,例如堆叠条形图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546071/

相关文章:

python - QFileDialog 取消时崩溃

python - 选择 pandas 数据帧的一部分时保留索引

python - Azure 计算机视觉 SDK read_in_stream 始终返回错误请求

python - 使用python和RSA算法的加密聊天应用程序

r - plotly 生存图

R - 将对象存储在列表中

python - 如何缓存 Django Rest Framework API 调用?

python-3.x - 从 pandas 数据框中的类别(列)中选择前 n 行并对其执行计算

python - 我终于理解了递归还是我错得离谱?

python - 如何在 Plotly for Python 中悬停时突出显示整个跟踪?