Forum Discussion
Make a clustered bar chart with conditional formatted leged in Deneb.
- 10 months ago
Hi jaryszek,
You can assign a value to a color encoding by using the field operator in a scale's range after specifying the field to use for its domain, e.g.:
{ ... "encoding": { ... "color": { "field": "MeterCategory", "scale": { "range": {"field": "Color by Rank"} }, ... }, ... }, ... }This is also covered in the Vega-Lite documentation, with an example available here.
Full spec (based on yours above and corrected to work for this case). The visual data set consists of:
- Date (x encoding)
- Sum of CostInBillingCurrency (y encoding)
- MeterCategory (color encoding)
- Color by Rank (color range)
{ "data": { "name": "dataset" }, "mark": { "type": "bar", "tooltip": true }, "encoding": { "x": { "field": "Date", "type": "temporal", "timeUnit": "yearmonthdate", "axis": { "labelAngle": -40, "title": null } }, "y": { "field": "Sum of CostInBillingCurrency", "type": "quantitative", "axis": { "title": null } }, "color": { "field": "MeterCategory", "scale": { "range": {"field": "Color by Rank"} }, "legend": { "title": "Rank", "labelExpr": "datum.value === 'Others' ? 'Others' : 'Rank ' + datum.value", "orient": "right" } }, "order": { "field": "MeterCategory" } }, "config": { "view": { "stroke": null }, "axisY": { "grid": true }, "bar": { "size": 10 } } }I've also attached a copy of your workbook, along with this working visual.
Thanks for using Deneb!
Daniel
Hello jaryszek,
Thank you for posting your query in the Microsoft Fabric Community Forum. Here’s how you can achieve this in Deneb:
Prepare your data with a “Rank” field that categorizes each bar (e.g: 1, 2, 3, 4, 5) and In your Deneb visual’s Vega-Lite JSON, set up a color scale that directly relates each rank value to a specific hex color. The legend will reflect these specific assignments.
Example json code:
"color": {
"field": "Rank",
"type": "nominal",
"scale": {
"domain": [1, 2, 3, 4, 5, "Others"],
"range": ["#E81123", "#107C10", "#0078D4", "#FFB900", "#8E8CD8", "#B3B3B3"]
},
"legend": {
"title": "Rank",
"labelExpr": "datum.value == 'Others' ? 'Others' : 'Rank ' + datum.value"
}
}
Please give it a try and let me know if you encounter any issues.
Best regards,
Ganesh Singamshetty.
- jaryszek10 months ago
Super User
Thank you very much,
i tried with :{ "$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"name": "dataset"}, "transform": [ { "calculate": "(datum['Rank (Current Axis)'] == null || datum['Rank (Current Axis)'] > 5) ? 'Others' : toString(datum['Rank (Current Axis)'])", "as": "RankBucket" } ], "mark": {"type": "bar", "tooltip": true}, "encoding": { "x": { "field": "Date", "type": "temporal", "timeUnit": "yearmonthdate", "axis": {"labelAngle": -40, "title": null} }, "xOffset": { "field": "MeterCategory", "type": "nominal", "title": null }, "y": { "field": "Sum of CostInBillingCurrency", "type": "quantitative", "aggregate": "sum", "axis": {"title": null} }, "color": { "field": "RankBucket", "type": "nominal", "scale": { "domain": ["1","2","3","4","5","Others"], "range": ["#E81123","#107C10","#0078D4","#FFB900","#8E8CD8","#B3B3B3"] }, "legend": { "title": "Rank", "labelExpr": "datum.value === 'Others' ? 'Others' : 'Rank ' + datum.value", "orient": "right" } }, "order": {"field": "MeterCategory"} }, "config": { "view": {"stroke": null}, "axisY": {"grid": true}, "bar": {"size": 10} } }
but have no idea how to make this working.
Can i use dynamic color range from power bi measure instead of this ?:"color": { "field": "Rank", "type": "nominal", "scale": { "domain": [1, 2, 3, 4, 5, "Others"], "range": ["#E81123", "#107C10", "#0078D4", "#FFB900", "#8E8CD8", "#B3B3B3"] },
Best wishes,
Jacek- dm-p10 months ago
Super User
Hi jaryszek,
You can assign a value to a color encoding by using the field operator in a scale's range after specifying the field to use for its domain, e.g.:
{ ... "encoding": { ... "color": { "field": "MeterCategory", "scale": { "range": {"field": "Color by Rank"} }, ... }, ... }, ... }This is also covered in the Vega-Lite documentation, with an example available here.
Full spec (based on yours above and corrected to work for this case). The visual data set consists of:
- Date (x encoding)
- Sum of CostInBillingCurrency (y encoding)
- MeterCategory (color encoding)
- Color by Rank (color range)
{ "data": { "name": "dataset" }, "mark": { "type": "bar", "tooltip": true }, "encoding": { "x": { "field": "Date", "type": "temporal", "timeUnit": "yearmonthdate", "axis": { "labelAngle": -40, "title": null } }, "y": { "field": "Sum of CostInBillingCurrency", "type": "quantitative", "axis": { "title": null } }, "color": { "field": "MeterCategory", "scale": { "range": {"field": "Color by Rank"} }, "legend": { "title": "Rank", "labelExpr": "datum.value === 'Others' ? 'Others' : 'Rank ' + datum.value", "orient": "right" } }, "order": { "field": "MeterCategory" } }, "config": { "view": { "stroke": null }, "axisY": { "grid": true }, "bar": { "size": 10 } } }I've also attached a copy of your workbook, along with this working visual.
Thanks for using Deneb!
Daniel
- jaryszek10 months ago
Super User
Wow, you are the boss!!
Thank you so much, really appreciated.
Best,
Jacek
- v-ssriganesh10 months ago
Community Support
Hello jaryszek,
No, Deneb cannot use a Power BI measure (like [Rank (Current Axis)]) for the color range. Measures are not available in the Deneb dataset only table columns are.Use Vega-Lite transforms (like aggregate + window) to calculate rank and assign colors dynamically no DAX needed.
Thank you,
Ganesh Singamshetty.- dm-p10 months ago
Super User
Hi v-ssriganesh,
To clarify, measures absolutely can be used in a Deneb dataset. Deneb will aggregate measures by all grouping columns, just like a core table visual does. This problem can be solved either internally to the visual spec or using a measure. I have provided a solution using the OP's desired measure in the visual dataset above.
Cheers,
Daniel