首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以绘图方式钻取条形图

以绘图方式钻取条形图
EN

Stack Overflow用户
提问于 2020-05-10 00:45:07
回答 1查看 872关注 0票数 2

我正在尝试创建一个条形图,我想在其中钻取区域,然后查看不同城市3年范围内的人口。基本上我找到了这个https://community.plotly.com/t/drill-down-function-for-graphs-embedded-in-dash-app/12290/9,但我无法实现

代码语言:javascript
复制
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
from dash.dependencies import Output, Input, State
import numpy as np
import pandas as pd
import plotly.figure_factory as ff
from pandas import read_excel

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

# app = dash.Dash()
file_name = 'samplePop1.csv'
df = pd.read_csv(file_name)
print(df.head())

colors = {
    'black' : '#000000',
    'text' :  '#696969',
    'plot_color' : '#C0C0C0',
    'white' : '#FFFFF'
}


app.layout = html.Div ([
                        dcc.Graph(    
                            id = 'bar-chart',
                        figure = { 'data' : 
                                    [
                                        {'x' : df['Name'],'y':df['Population Census 1991'],'type':'bar','name':'Population Census 1991'},
                                        {'x' : df['Name'],'y':df['Population Census 2001'],'type':'bar','name':'Population Census 2001'},
                                        {'x' : df['Name'],'y':df['Population Census 2011'],'type':'bar','name':'Population Census 2011'}

                                    ],
                                'layout' : {
                                    'plot_bgcolor' : colors['white'],
                                    'paper_bgcolor' : colors['white'],
                                    'font' : {
                                        'color' : colors['white']
                                    },
                                    'title' : 'Bar Chart',
                                    'orientation':'h'
                                }
                                }
                        )
                    ])
if __name__ == '__main__':
    app.run_server(port =  '8080' , debug ='True')

条形图应该首先显示3年范围内的人口区域,当我点击一个区域时,它将显示区域比较。此外,另一个基本图表,其中他们将是2点击行动,地区和城市智慧,以显示人口为3年的范围,它应该显示清楚的值,更有可能它应该是可滚动的。

指向csv文件https://github.com/9192gks/mapbox/blob/master/samplePop1.csv的链接

EN

回答 1

Stack Overflow用户

发布于 2021-07-08 01:40:31

在callback_context的帮助下,在Dash中查看这个向下钻取的示例。

在这个例子中,我只展示了一个单层的向下钻取,以保持它的简单性,但只需很少的修改,就可以实现多-level向下钻取。有一个后退按钮,用于返回到原始图形。后退按钮仅显示在向下钻取的级别2上,并隐藏在原始底部级别上。

代码:

代码语言:javascript
复制
import dash
import dash_core_components as dcc
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output
import plotly.express as px
import pandas as pd

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])

# creating a dummy sales dataframe
product_sales = {'vendors':['VANS','VANS','VANS','VANS','NIKE','NIKE','NIKE','ADIDAS','ADIDAS','CONVERSE','CONVERSE','CONVERSE'],
                 'products': ['Tshirts','Sneakers','Caps','Clothing','Sports Outfit','Sneakers','Caps','Accessories','Bags','Sneakers','Accessories','Tshirts'],
                 'units sold': [2,15,3,8,37,13,7,4,12,7,8,2]
                 }
product_sales_df = pd.DataFrame(product_sales)

# all vendors sales pie chart
def sales_pie():
    df = product_sales_df.groupby('vendors').sum().reset_index()
    fig = px.pie(df, names='vendors',
                 values='units sold', hole=0.4)
    fig.update_layout(template='presentation', title='Sales distribution per Vendor')
    return fig

# creating app layout
app.layout = dbc.Container([
    dbc.Card([
            dbc.Button('', id='back-button', outline=True, size="sm",
                        className='mt-2 ml-2 col-1', style={'display': 'none'}),
            dbc.Row(
                dcc.Graph(
                        id='graph',
                        figure=sales_pie()
                    ), justify='center'
            )
    ], className='mt-3')
])

#Callback
@app.callback(
    Output('graph', 'figure'),
    Output('back-button', 'style'), #to hide/unhide the back button
    Input('graph', 'clickData'),    #for getting the vendor name from graph
    Input('back-button', 'n_clicks')
)
def drilldown(click_data,n_clicks):

    # using callback context to check which input was fired
    ctx = dash.callback_context
    trigger_id = ctx.triggered[0]["prop_id"].split(".")[0]

    if trigger_id == 'graph':

        # get vendor name from clickData
        if click_data is not None:
            vendor = click_data['points'][0]['label']

            if vendor in product_sales_df.vendors.unique():
                # creating df for clicked vendor
                vendor_sales_df = product_sales_df[product_sales_df['vendors'] == vendor]

                # generating product sales bar graph
                fig = px.bar(vendor_sales_df, x='products',
                             y='units sold', color='products')
                fig.update_layout(title='<b>{} product sales<b>'.format(vendor),
                                  showlegend=False, template='presentation')
                return fig, {'display':'block'}     #returning the fig and unhiding the back button

            else:
                return sales_pie(), {'display': 'none'}     #hiding the back button

    else:
        return sales_pie(), {'display':'none'}

if __name__ == '__main__':
    app.run_server(debug=True)

另请查看此thread以了解更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61700316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档