LoslegenKostenlos starten

DRY-Styling für Dash-Komponenten

Dein letztes Dashboard hat von wiederverwendbaren Komponenten profitiert. Jetzt gehst du einen Schritt weiter: Verwende eine Hilfsfunktion, um Zeilenumbrüche einzufügen, und vereinfache doppeltes Styling mit einer gemeinsamen Style-Funktion.

Die gemeinsamen Stilelemente, die dir aufgefallen sind, sind: 'display':'inline-block','margin':'0 auto','padding':'20px'

Die Funktion make_break() wurde für dich in Zeile 14 definiert. Sie nimmt ein Argument entgegen, das angibt, wie viele HTML-break-Tags erzeugt werden sollen, und gibt diese in einer Liste zurück.

Diese Übung ist Teil des Kurses

<Kurs>Dashboards mit Dash und Plotly erstellen</Kurs>
Kurs ansehen

Übungsanweisungen

  • Erstelle eine Funktion namens style_c(), die unter Zeile 21 ein layout_style-Dictionary mit allen gemeinsamen Stilelementen ('display':'inline-block','margin':'0 auto','padding':'20px') zurückgibt.
  • Verwende die Funktion make_break(), um die in den Kommentaren markierte Anzahl an Zeilenumbrüchen unter den Zeilen 28, 31 und 29 einzufügen.
  • Verwende die Funktion style_c(), um dem html.H2()-Element unter Zeile 35 Styling hinzuzufügen.
  • Verwende die Funktion style_c(), um das spezifische Styling, das bereits auf der DatePickerSingle()-Komponente unter Zeile 47 liegt, zu ergänzen.

Interaktive praktische Übung

Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.

from dash import Dash, dcc, html, Input, Output, callback
import plotly.express as px
import pandas as pd
from datetime import datetime, date
ecom_sales = pd.read_csv('/usr/local/share/datasets/ecom_sales.csv')
logo_link = 'https://assets.datacamp.com/production/repositories/5893/datasets/fdbe0accd2581a0c505dab4b29ebb66cf72a1803/e-comlogo.png'
ecom_sales['InvoiceDate'] = pd.to_datetime(ecom_sales['InvoiceDate'])

app = Dash()

def make_break(num_breaks):
    br_list = [html.Br()] * num_breaks
    return br_list

def add_logo():
    corp_logo = html.Img(
        src=logo_link, 
        style={'width':'75px','margin':'20px 20px 5px 5px','border':'1px dashed lightblue','display':'inline-block'})     
    return corp_logo

# Create a function to add corporate styling
def style_c():
    layout_style = {____}
    return layout_style

app.layout = [
  add_logo(),
  # Insert two HTML breaks
  ____,
  html.H1('Sales breakdowns'),
  # Insert three HTML breaks
  ____,
  html.Div([
    add_logo(),
    # Style using the styling function
    html.H2('Controls', style=____),
    add_logo(),
    html.H3('Sale Date Select'),
    # Insert two HTML breaks
    ____,
    dcc.DatePickerSingle(
      id='sale_date',
      min_date_allowed=ecom_sales.InvoiceDate.min(),
      max_date_allowed=ecom_sales.InvoiceDate.max(),
      initial_visible_month=date(2011, 4, 1),
      date=date(2011, 4, 11),
      # Add styling using the styling function
      style={'width':'200px'}.____(____))],
    style={'width':'350px', 'height':'350px', 'vertical-align':'top', 'border':'1px solid black',
           'display':'inline-block', 'margin':'0px 40px'}),
  html.Div([
    dcc.Graph(id='sales_cat'),
    html.H2('Daily Sales by Major Category', style={'border':'2px solid black', 'width':'400px', 'margin':'0 auto'})],
    style={'width':'700px','display':'inline-block'}),
  add_logo()
]

@callback(
    Output(component_id='sales_cat', component_property='figure'),
    Input(component_id='sale_date', component_property='date')
)
def update_plot(input_date):
    sales = ecom_sales.copy(deep=True)
    if input_date:
        sales = sales[sales['InvoiceDate'] == input_date]
    ecom_bar_major_cat = sales.groupby('Major Category')['OrderValue'].agg('sum').reset_index(name='Total Sales ($)')
    bar_fig_major_cat = px.bar(
        title=f'Sales on: {input_date}',data_frame=ecom_bar_major_cat, orientation='h', 
        x='Total Sales ($)', y='Major Category')
    return bar_fig_major_cat

if __name__ == '__main__':
    app.run(debug=True)
Code bearbeiten und ausführen