Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
1 year ago
Solved

Waterfall chart in Power BI

I need help with Power BI. I have to create a waterfall chart (like the attached image), where the first bar should go in blue. Bars 2, 3, 4, 5 must vary their color (green/red) if the value increases/decreases, and bar 6 is also blue (it is the total of the 5 previous columns), in fact I must change the name of total to that column to the measure of the graph. If someone can help me and/or guide me, I would be grateful (if you need the DAX measures already created for the amounts, let me know).


6 Replies

  • Hi Syndicate_Admin 

     

    Prepare Your Data Table

    Your data should have at least these columns:

    • Category (e.g., "Mg. Contribución Jun-25 Plan", "Δ Mg. Servicios", etc.)

    • Value (numerical deviation or total)

    • Type ("Increase", "Decrease", "Total", or "Start" for coloring purposes)

    Example data structure:

    Category Value Type
    Mg. Contribución Jun-25 Plan176Start
    Δ Mg. Servicios-318Decrease
    Δ Mg. Equipos26Increase
    Δ C. Op. VP Digital-16Decrease
    Δ C. Comercial-42Decrease
    Mg. Contribución Jun-25 Real-174Total

    2. Insert a Waterfall Visual

    • In Power BI, select the Waterfall chart visual from the “Visualizations” pane.

    • Drag Category to the X-axis.

    • Drag Value to “Y-axis” or “Values”.

    3. Set Proper Bar Colors

    Power BI default waterfall chart automatically assigns colors, but to customize:

    • Go to Format panel for the visual.

    • Expand Data colors.

    Set colors manually for each “Category”:

    • Set the first bar (“Start”) and last bar (“Total”) to Blue.

    • Set “Increase” type bars (positive values) to Green.

    • Set “Decrease” type bars (negative values) to Red.

    If you don’t see options to set colors by data, use “Conditional formatting”:

    • In “Data colors”, click the “fx” (function) button to apply rules.

    • Base the formatting on your “Type” (if you have “Type” column):

      • If “Type” is “Increase”, set color to green.

      • If “Type” is “Decrease”, set color to red.

      • If “Type” is “Start” or “Total”, set color to blue.

    4. Rename the Total Column

    Power BI allows replacing labels:

    • Click on the last bar (Total) in the chart.

    • In the Data label properties or through the Data table, you can rename the “Total” to your measure (e.g., “Mg. Contribución Jun-25 Real”).

    • Alternatively, edit the value in your data table to show the desired label.

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Thanks for the answer.

      I will try to apply it.

      Anyway, these are my measurements:

      Tabla_EstadoResultados4 = 
      DATATABLE(
          "Cascada", STRING,
          "OrdenCascada", INTEGER,
          "ColorHex", STRING,
          "TipoBarra", STRING,
          {
              {"Mg Contribución 2025P", 1, "#10069F", "Total"},
              {"Δ Mg Servicios", 2, "", "Variacion"},
              {"Δ Mg Equipos", 3, "", "Variacion"},
              {"Δ C. Op. VP Digital", 4, "", "Variacion"},
              {"Δ C. Comercial", 5, "", "Variacion"},
              {"Mg Contribución Real", 6, "#10069F", "Total"},
              {"Mg Contribución Frcst", 7, "#10069F", "Total"},
              {"Margen Directo Total", 8, "", "Variacion"},
              {"Margen Contribución", 9, "", "Variacion"},
              {"EBITDA", 10, "", "Variacion"}
          }
      )
      
      
      
      Cascada_Mg_RP = 
      VAR LineaSeleccionada = SELECTEDVALUE('Tabla_EstadoResultados4'[Cascada])
      VAR TipoIngresoR = "Real"
      VAR TipoIngresoP = "Plan"
      VAR Anio = 2025
      VAR MesHoy = MONTH(TODAY()) - 2
      VAR HayFiltroMes = ISFILTERED('Dim_Calendario'[MesCorto])
      
      ----- MARGEN SERVICIOS REAL -----
      VAR IngresosServiciosReal =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "01. Ingresos Servicios",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "01. Ingresos Servicios",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR CostosServiciosReal =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "02. Costos de Servicios",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "02. Costos de Servicios",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR MargenServiciosReal = IngresosServiciosReal + CostosServiciosReal
      
      ----- MARGEN SERVICIOS PLAN -----
      VAR IngresosServiciosPlan =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "01. Ingresos Servicios",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "01. Ingresos Servicios",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR CostosServiciosPlan =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "02. Costos de Servicios",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "02. Costos de Servicios",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR MargenServiciosPlan = IngresosServiciosPlan + CostosServiciosPlan
      VAR MargenServicios = MargenServiciosReal - MargenServiciosPlan
      
      ----- MARGEN EQUIPOS REAL -----
      VAR IngresosEquiposReal =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "04. Ingresos por venta de equipos / productos",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "04. Ingresos por venta de equipos / productos",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR CostosEquiposReal =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "05. Costos de Equipos",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "05. Costos de Equipos",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR MargenEquiposReal = IngresosEquiposReal + CostosEquiposReal
      
      ----- MARGEN EQUIPOS PLAN -----
      VAR IngresosEquiposPlan =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "04. Ingresos por venta de equipos / productos",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "04. Ingresos por venta de equipos / productos",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR CostosEquiposPlan =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "05. Costos de Equipos",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Costo N1] = "05. Costos de Equipos",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR MargenEquiposPlan = IngresosEquiposPlan + CostosEquiposPlan
      VAR MargenEquipos = MargenEquiposReal - MargenEquiposPlan
      
      ----- COSTOS OPERACIONALES -----
      VAR RealCostosOperacionales =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Template] = "G. Costo Operacional Serti",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Template] = "G. Costo Operacional Serti",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR PlanCostosOperacionales =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Template] = "G. Costo Operacional Serti",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Template] = "G. Costo Operacional Serti",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR MargenCostosOperacionales = RealCostosOperacionales - PlanCostosOperacionales
      
      ----- COSTOS COMERCIALES -----
      VAR RealCostosComerciales =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Template] = "F. Costo Comercial",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Template] = "F. Costo Comercial",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR PlanCostosComerciales =
      IF(
          HayFiltroMes,
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Template] = "F. Costo Comercial",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
          ),
          CALCULATE(
              SUM('Base_Margen'[Monto]),
              'Base_Margen'[Linea Template] = "F. Costo Comercial",
              'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
              'Base_Margen'[Año] = Anio,
              'Base_Margen'[Mes] <= MesHoy
          )
      )
      
      VAR MargenCostosComerciales = RealCostosComerciales - PlanCostosComerciales
      
      VAR MgContribucion =
      CALCULATE(
          SUM('Base_Margen'[Monto]),
          'Base_Margen'[Linea Template] IN
          {
              "A. Ingreso Servicios", "B. Costo Servicios D", "C. Electricidad",
              "D. Ingresos por Equipos", "E. Costo por Equipos",
              "F. Costo Comercial", "G. Costo Operacional Serti"
          },
          'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
          'Base_Margen'[Año] = Anio
      )
      -
      CALCULATE(
          SUM('Base_Margen'[Monto]),
          'Base_Margen'[Linea Template] IN {
              "A. Ingreso Servicios", "B. Costo Servicios D", "C. Electricidad",
              "D. Ingresos por Equipos", "E. Costo por Equipos",
              "F. Costo Comercial", "G. Costo Operacional Serti"
          },
          'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
          'Base_Margen'[Año] = Anio
      )
      
      
      ----- RESULTADO FINAL -----
      VAR Resultado =
      SWITCH(
          TRUE(),
      
          LineaSeleccionada="Mg Contribución 2025P",
          IF(
              HayFiltroMes,
              CALCULATE(
                  SUM('Base_Margen'[Monto]),
                  'Base_Margen'[Linea Template] IN {
                      "A. Ingreso Servicios", "B. Costo Servicios D", "C. Electricidad",
                      "D. Ingresos por Equipos", "E. Costo por Equipos",
                      "F. Costo Comercial", "G. Costo Operacional Serti"
                  },
                  'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
                  'Base_Margen'[Año] = Anio,
                  'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
              ),
              CALCULATE(
                  SUM('Base_Margen'[Monto]),
                  'Base_Margen'[Linea Template] IN {
                      "A. Ingreso Servicios", "B. Costo Servicios D", "C. Electricidad",
                      "D. Ingresos por Equipos", "E. Costo por Equipos",
                      "F. Costo Comercial", "G. Costo Operacional Serti"
                  },
                  'Base_Margen'[Tipo Ingreso] = TipoIngresoP,
                  'Base_Margen'[Año] = Anio,
                  'Base_Margen'[Mes] <= MesHoy
              )
          ),
      
          LineaSeleccionada="Δ Mg Servicios", MargenServicios,
          LineaSeleccionada="Δ Mg Equipos", MargenEquipos,
          LineaSeleccionada="Δ C. Op. VP Digital", MargenCostosOperacionales,
          LineaSeleccionada="Δ C. Comercial", MargenCostosComerciales,
      
          LineaSeleccionada="Mg Contribución Real",
          IF(
              HayFiltroMes,
              CALCULATE(
                  SUM('Base_Margen'[Monto]),
                  'Base_Margen'[Linea Template] IN {
                      "A. Ingreso Servicios", "B. Costo Servicios D", "C. Electricidad",
                      "D. Ingresos por Equipos", "E. Costo por Equipos",
                      "F. Costo Comercial", "G. Costo Operacional Serti"
                  },
                  'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
                  'Base_Margen'[Año] = Anio,
                  'Base_Margen'[Mes] IN VALUES('Dim_Calendario'[MesNum])
              ),
              CALCULATE(
                  SUM('Base_Margen'[Monto]),
                  'Base_Margen'[Linea Template] IN {
                      "A. Ingreso Servicios", "B. Costo Servicios D", "C. Electricidad",
                      "D. Ingresos por Equipos", "E. Costo por Equipos",
                      "F. Costo Comercial", "G. Costo Operacional Serti"
                  },
                  'Base_Margen'[Tipo Ingreso] = TipoIngresoR,
                  'Base_Margen'[Año] = Anio,
                  'Base_Margen'[Mes] <= MesHoy
              )
          ),
      
          LineaSeleccionada="Mg Contribución", MgContribucion
      )
      
      VAR Color = 
      SWITCH(
          TRUE(),
          LineaSeleccionada IN {"Mg Contribución 2025P", "Mg Contribución Real"}, "#10069F",
          LineaSeleccionada="Mg Contribución", "#FFFF00",
          Resultado >= 0, "#47E844",
          Resultado < 0, "#D30815",
          "#808080"
      )
      
      RETURN Resultado

      Si me guías, te lo agradecería.
  • v-sdhruv's avatar
    v-sdhruv
    Icon for Community Support rankCommunity Support

    Hi @Syndicate_Admin ,

    Just wanted to check if you got a chance to review the suggestions provided and whether that helped you resolve your query?

  • v-sdhruv's avatar
    v-sdhruv
    Icon for Community Support rankCommunity Support

    Hi Syndicate_Admin ,

    Since we didnt hear back, we would be closing this thread.
    If you need any assistance, feel free to reach out by creating a new post.

    Thank you for using Microsoft Community Forum