Forum Discussion
Waterfall chart in Power BI
- 1 year ago
Hi Syndicate_Admin
Please relate to my responce in the linked discussion :If this post helps, then please consider Accepting it as the solution to help the other members find it more quickly.
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:
| Mg. Contribución Jun-25 Plan | 176 | Start |
| Δ Mg. Servicios | -318 | Decrease |
| Δ Mg. Equipos | 26 | Increase |
| Δ C. Op. VP Digital | -16 | Decrease |
| Δ C. Comercial | -42 | Decrease |
| Mg. Contribución Jun-25 Real | -174 | Total |
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.
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.