繁体   English   中英

Plotly 子图不喜欢环形条形图?

[英]Plotly subplot does not like looped bar plots?

我正在尝试创建一个由一个条形图和一个数据表组成的子图的简单 pdf:

条形图和表格 function 有效,但是当我尝试创建子图 plotly 时出现以下错误:

ValueError:
    Invalid element(s) received for the 'data' property of        
        Invalid elements include

我写了以下内容: 难道我不喜欢我循环酒吧的痕迹吗?

我首先创建函数来构建条形图和数据表:

import plotly
import plotly.graph_objects as go
import plotly.figure_factory as ff
import os
import numpy as np
from plotly.subplots import make_subplots
import pandas as pd


def build_barchart(df,columns):

    x = df.City.unique() # City column should always be the x axis
    fig = go.Figure()
    fig.update_layout(barmode='stack')
    for column in columns:
        Y=df[column].tolist()
        fig.add_trace(go.Bar(name=column,x=x,y=Y))

    return fig 

def build_table(df):

    table = ff.create_table(df)
    return table

def create_pdf(df,columns):

    fig = make_subplots(rows=1, cols=2)

    fig.add_trace(
        build_barchart(df,columns),
        row=1, col=1
    )

    fig.add_trace(
        build_table(df),
        row=1, col=2
    )


    if not os.path.exists("images"):
        os.mkdir("images")


    fig.write_image("images/fig1.pdf")
    return

创建构建功能后,我尝试使用它们......

df = pd.read_csv('DATA.csv', delimiter=';')
columns=['%Something','%Dogs','%Cats','%Cars']

table = build_table(df)
bars =  build_barchart(df,columns)

fig = make_subplots(rows=1, cols=2)

fig.add_trace(
    bars,
    row=1, col=1
)

fig.add_trace(
    table,
    row=1, col=2
)

fig.show()

测试数据

City;%Something;%Dogs;%Cats;%Cars;Nr Alarms;Nr Block
USA;60;10;5;25;1;1
CANADA;20;10;5;65;2;2
MEXICO;90;5;5;0;3;3
SWEDEN;10;10;5;75;4;4

弄清楚我做错了什么!

而不是使用 plotly.figure_factory 的 create_table() 我使用 plotly.graph_objects Table()

我还必须定义用于创建子图的图形类型。 创建子图的最终解决方案如下所示:

def build_subplot(df,columns):

    x = df.City.astype('str').unique()
    fig = make_subplots(rows=1, cols=2,
        specs=[
            [{"type": "bar"},{"type": "table"}]
            ]
        )
    fig.update_layout(barmode='stack')

    for column in columns:
        Y=df[column].tolist()
        fig.append_trace(go.Bar(name=column,x=x,y=Y),row=1,col=1)

    fig.add_trace(
        go.Table(
            header=dict(
                values=df.columns,
                font=dict(size=10),
                align="left"
            ),
            cells=dict(
                values=[df[k].tolist() for k in df.columns],
                align = "left")
        ),
        row=1, col=2
        )


    return fig 

我希望这对其他人有帮助:)

请不要把它当作答案。 鉴于您的代码有一些缺陷,我正在添加一个完善的版本。 特别是如果你有重复的国家x = df.City.astype('str').unique()不能很好地与Y一起工作,你应该在 plot 之前安排/检查你的数据。

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

df = pd.DataFrame({
 'City': {0: 'USA', 1: 'CANADA', 2: 'MEXICO', 3: 'SWEDEN'},
 '%Something': {0: 60, 1: 20, 2: 90, 3: 10},
 '%Dogs': {0: 10, 1: 10, 2: 5, 3: 10},
 '%Cats': {0: 5, 1: 5, 2: 5, 3: 5},
 '%Cars': {0: 25, 1: 65, 2: 0, 3: 75},
 'Nr Alarms': {0: 1, 1: 2, 2: 3, 3: 4},
 'Nr Block': {0: 1, 1: 2, 2: 3, 3: 4}})

def build_subplot(df, columns=None):
    if columns is None:
        columns =  df.columns
    # only columns starting with %
    columns = [col for col in columns if col.startswith("%")]

    fig = make_subplots(rows=1, cols=2,
        specs=[
            [{"type": "bar"},{"type": "table"}]
            ]
        )
    fig.update_layout(barmode='stack')

    for column in columns:
        fig.append_trace(
            go.Bar(x=df["City"],
                   y=df[column],
                   name=column),
            row=1,col=1)

    fig.add_trace(
        go.Table(
            header=dict(
                values=df.columns,
                font=dict(size=10),
                align="left"
            ),
            cells=dict(
                values=df.T.values.tolist(),
                align = "left")
        ),
        row=1, col=2
        )


    return fig


build_subplot(df, ['%Something', '%Dogs', 'Nr Block'])

在此处输入图像描述

附录:我认为如果你的子图有 1 列和 2 行会更好看,因为表格中的一些细节可能难以阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM