【问题标题】:Plotting 3 pie charts side-by-side using the domain property使用域属性并排绘制 3 个饼图
【发布时间】:2019-03-29 12:10:06
【问题描述】:

我正在尝试并排绘制 3 个饼图。我不明白为什么下面的代码使饼图在页面对角向左书写而不是水平向左书写。

这是我的代码:

app.layout = html.Div([
    html.Div([
        dcc.Graph(id='TPiePlot',
                  figure={
                      'data': [go.Pie(labels=labels1,
                                      values=values1,
                                      marker=dict(colors=colors, line=dict(color='#fff', width=1)),
                                      hoverinfo='label+value+percent', textinfo='value',
                                      domain={'x': [0, .25], 'y': [0, 1]}
                                      )
                               ],
                      'layout': go.Layout(title='T',
                                          autosize=True
                                          )
                  }
                  ),
        dcc.Graph(id='RPiePlot',
                  figure={
                      'data': [go.Pie(labels=labels2,
                                      values=values2,
                                      marker=dict(colors=colors, line=dict(color='#fff', width=1)),
                                      hoverinfo='label+value+percent', textinfo='value',
                                      domain={'x': [0.30, .55], 'y': [0, 1]}
                                      )
                               ],
                      'layout': go.Layout(title='R',
                                          autosize=True
                                          )
                  }
                  ),

        dcc.Graph(id='RoPiePlot', 
                  figure={
                      'data': [go.Pie(labels=labels3,
                                      values=values3,
                                      marker=dict(colors=colors, line=dict(color='#fff', width=1)),
                                      hoverinfo='label+value+percent', textinfo='value',
                                      domain={'x': [0.60, 0.85], 'y': [0, 1]}
                                      )
                               ],
                      'layout': go.Layout(title='Ro',
                                          autosize=True
                                          )
                  }
                  )
    ])
])

这是接受答案中选项 1 的情况(这是我需要使用的选项)。我得到了三种不同的尺寸以及覆盖一些饼图的图例:

我很难理解如何使用 CSS 重新调整短划线图的大小,因为整个容器的大小而不是实际图表的大小增加了,而且我不知道如何仅针对图表本身来使大小变大。有没有解决的办法?

【问题讨论】:

    标签: python plotly plotly-dash


    【解决方案1】:

    Plotly 的 domain 用于子图。在您的情况下,您一个接一个地绘制三个单独的图,并且您分别设置域。

    您至少有两个选择:

    1. 使用您现在使用的方法,即 3 个单独的图,并使用 CSS 定义它们的位置
    2. 用三个数字创建一个绘图,并使用domain 调整它们的位置。

    选项 1

    import dash
    import flask
    import dash_html_components as html
    import plotly.graph_objs as go
    import dash_core_components as dcc
    
    server = flask.Flask('app')
    app = dash.Dash('app', server=server,
                    external_stylesheets=['https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css'])
    
    labels = [['monkeys', 'elephants'],
              ['birds', 'dinosaurs'],
              ['unicorns', 'giraffes']]
    
    values = [[50, 40],
              [100, 10],
              [100, 20]]
    
    data = []
    
    for label, value in zip(labels, values):
        data.append(html.Div([dcc.Graph(figure={'data': [go.Pie(labels=label,
                                                                values=value,
                                                                hoverinfo='label+value+percent', textinfo='value'
                                                                )]})
                              ], className='col-sm-4'))
    
    app.layout = html.Div(data, className='row')
    
    app.run_server()
    

    选项 2

    import dash
    import flask
    import dash_html_components as html
    import plotly.graph_objs as go
    import dash_core_components as dcc
    
    server = flask.Flask('app')
    app = dash.Dash('app', server=server)
    
    labels = [['monkeys', 'elephants'],
              ['birds', 'dinosaurs'],
              ['unicorns', 'giraffes']]
    
    values = [[50, 40],
              [100, 10],
              [100, 20]]
    
    data = []
    x1 = 0
    x2 = 0.25
    for label, value in zip(labels, values):
        data.append(go.Pie(labels=label,
                           values=value,
                           hoverinfo='label+value+percent', textinfo='value',
                           domain={'x': [x1, x2], 'y': [0, 1]}
                                          )
                    )
        x1 = x1 + 0.30
        x2 = x1 + 0.25
    
    
    
    app.layout = html.Div([
        html.Div([dcc.Graph(figure={'data': data})])
    ])
    
    
    app.run_server()
    

    【讨论】:

    • 谢谢!那行得通。有没有办法以任何方式分隔选项 2 中的图例,以便我们可以分辨哪些图例属于哪个饼图?在您的示例中,您有 2 个值,因此看起来不错。我在每个饼图中都有很多值,因此希望使图例更加清晰。
    • 不是真的,想法是加入相似的图
    • 哦,我明白了。在这种情况下,我会选择选项 1。但我遇到的问题是因为我有很多值,饼图的大小不同,或者一个被图例完全覆盖(更新了问题以显示它)。任何想法如何解决这个问题?
    • 你能打开一个单独的问题并添加数据来创建图表吗?
    猜你喜欢
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多