how to create a shape with min and max values power bi - powerbi

I have a data below:
xmin xmax ymin ymax
2 4 1 2
4 6 2 3
I wanted to generate a shape which I can use to fill in values. Please assist.
Thank you

Create your data like this.
Make sure every column says do not aggregate.
Import the Deneb visual from marketplace.
Add the fields to the Deneb visual well as follows:
Paste the following code into Deneb.
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"width": 300,
"height": 240,
"background": "white",
"data": {"name": "dataset"},
"layer": [
{
"mark": {"type": "rect", "color": "#9bc2e6"}
}
],
"encoding": {
"x": {
"field": "xmin",
"type": "quantitative",
"scale": {"domain": [0, 10]}
},
"x2": {"field": "xmax"},
"y": {
"field": "ymin",
"type": "quantitative",
"scale": {"domain": [8, 0]}
},
"y2": {"field": "ymax"},
"color":{"field": "id"}
}
}
That's it.

Related

How do I use aggregates in grouped marks?

I'm trying to use the min and max aggregates of a quantitative column (Total bombers) grouped by another column (Country) in a rule mark of my visual. I want the rule y property to start at the minimum value of Total bombers and the rule y2 property to end at the maximum value of total bombers, but I can't seem to find the right syntax for the min and max aggregates of the rule mark. I can get the result I'm looking for by not grouping the marks but I would like to implement it for grouped marks so I can re-use it more easily.
Spec for grouped version I'm trying to use min and max aggregates in:
https://vega.github.io/editor/#/url/vega/N4IgJAzgxgFgpgWwIYgFwhgF0wBwqgegIDc4BzJAOjIEtMYBXAI0poHsDp5kTykSArJQBWENgDsQAGhAATONABONHJnaT0AQQAETJBBpRtAGxri422EkWZtcAB5IEOY3ErSQAdxqz6aAQAMATLwNGRYaABMQTI4SLKyZmT+MgZk4kjGEGgA2gC6MrJImCioOaAZCHBoIExsCExwitkyDIrGNVi4+ES0EJjUdIxMDBBNUBKYcOIDEwgkssRsbIryigQCTADMAQCcuwDssgAcBwHHCUgHx1tMTJFMuwKykXC7cABmWwAsBIpIngIACF6o1FABSSICaIAcSQOEoUAgxA8HxWyEwaFAmAAnjhqugkSjYtYxliQAAVNglYy6UFNbLocQMBpNDwATTg1hqzNZihAAF8BTJMP9xBA0YoELlsXiCSBJQgGMYUDJ9DUilMPA4cPz0GoqgAKTVwA1wY3FFmUTnWKTaACMdvtAEpnYKpLL8TUPjRjFN+TIdXq5JaENauYptAAeAC8Dt2xwCgryAoKIGgmQUMpAlXl9g8uK9+poVQ8YrI8u8vhgHlk9SQZnJmtKtXpzVRNDgxlkGuK1SFHpzTnlOILcpqpnM3Jk5floXCmJk4kMBNFDDgMgAXk02Gg1xu5PXG6hQM2anU+S0FZ3uzUqTS6ZfBcKKsOahNjCsx0WQCtEhkOhnJBxArd8+zIFZR0KI8NFPYoWwvMErx9Lse3QABhNgGBmRRRyFNMkHsLMylAFZOxmc9qUweoPAzVwanzF9f2UaZMXQVwPkXdMoEzGo8LTZBFAAa0ZcoQELeUyEULCcFRaTpRPBUkCgU1yVzGoxhYq8z3QRCGQ8KSZKYUcMKwnC8OFEBBJE7N5CUFQ1AkGoABkzAsSU7CWYwGEc8RtDYD5tGoh89OaXQcUsMzRSg8Tx3Yty5JoxSdPTJpO2ySzpgmeRyVYtlFPzRS6LzDtUN7LVLJM0Bir40rb3Qe9MkfJD3XTUU2CEglqp4+jCTYT8A2vMrTOw6LWv6aTOvQ+FyWITJ1xqaTsJ7SyJo6uAAHUfD8RS5u8gktlW9rOoAeTiKA6CqkA9oW1AAkoAQhQHU8FCgZRVHUGoAAU2DMTAIG0Dzgqa0KAeMyLRtw795QgHEGn6xKFLgkoNLSrNMvEbKupAPK9VAQrut49B8xkFD6pDCqZCumr0Bism0MpakQbbDLUhobdZvmglAksn1jA6IqevlD8v1Jm8GcwyG8NSY7Nu2mtdq5qIAiOybsZu+VTAXCAhJxJh9ufVocBNck+eMM7lMuzmDdQe1VfWi2Ltxa3bpVyyYDYUg8batXHatxWbbtp7Bzst6HM+9AACVlQZXRTU8OBpgh8ygqZ2lQu0XkWpFOKQEUGPEabeDUa01qsrYHLFIYY2+3JAnuKJkASaG8mTcq8kaZAOnxbvNPmv0yrIhdglohVmW1eHicwiwHW9YN+3Oq26tJ9QQ7x4d87-dADW0Hux6npTFMgA
Spec for non-grouped version that achieves what I want to do:
https://vega.github.io/editor/#/url/vega/N4IgJAzgxgFgpgWwIYgFwhgF0wBwqgegIDc4BzJAOjIEtMYBXAI0poHsDp5kTykSArJQBWENgDsQAGhAATONABONHJnaT0AQQAETJBBpRtAGxri422EkWZtcAB5IEOY3ErSQAdxqz6aAQAMATLwNGRYaABMQTI4SLKyZmT+MgZk4kjGEGgA2gC6MrJImCioOaAZCHBoIExsCExwitkyDIrGNVi4+ES0EJjUdIxMDBBNUBKYcOIDEwgkssRsbIryigQCTADMAQCcuwDssgAcBwHHCUgHx1tMTJFMuwKykXC7cABmWwAsBIpIngIACF6o1FABSSICaIAcSQOEoUAgxA8HxWyEwaFAmAAnjhqugkSjYtYxliQAAVNglYy6UFNbLocQMBpNDwATTg1hqzNZihAAF8BTJMP9xBA0YoELlsXiCSBJQgGMYUDJ9DUilMPA4cPz0GoqgAKTVwA1wY3FFmUTnWKTaACMdvtAEpnYKpLL8TUPjRjFN+TIdXq5JaENauYptAAeAC8Dt2xwC7s98pwNCWmJkZEUbAYOCYONyIBt-IKCpocGMshqAGFczNFIWZMRMgx5VSaXS+dlhSnvejlaqQOr0CbtfZdTUzRaptPNVaS06na7kyBcV70IrBx4R5TqZku2CWiAgxrQzkAOQAZTYxArtgAquJ1Be8toANTaecIS9PuhwWRtCvEopggV9BTyXsQEqeU4FIGZjxbYw20ZcoQAAOSceUhxLNB7SeSIZAAEQUKBlFUdQagAGRWRBtBUCAWVXTCqhqJgOQjPDdgANmCEASKUFQ1AkGoAEk8BZExaOlAUy1FJBxUVGU1zlfspW3NVGRDLVAwnYM52KU0aCNb9w1tB1lzdWTZNSKBMgUZSYJqewPHXeUzQ8MUyHlbxfBgDxZHqJAzHJTVSlqelmlRCsqzPLUhQ9aCsJqJsVI3EBTHMbkZC8+VQnCTNoMMAlRTbGQAC8mjYNBSrgQogpC1BQDCtjIuPH1K2rdAOwPOpu0FKCnMJNhjBWVzVPQFZEgyDocoU7yajsqYyBWVLAuQRrmuKcK+qPaLOtretRULIUyyQewHLKUAVgrGZWuweoPGgeznNXG7pkxdBXA+QrntcFKIJkZBFAAa1Q5rSPI4SNBAKizAsSU7CWZDoe0NgPm0B8r0PBlxvSzLqhkD4c2lJrtJ2tr3RPcQJnkckPrZMmXLJv75RcomYq67TqmFEBCxZuz-vQVKOti9A-ymQDgMMntUlFNgQbgGt4XJJC2xqHMGHEatef6HNFYAdR8PwybVgktl1+XFYAeTiKA6H50AzbQAJKAEIUEohwSKJE9AAAU2DMTAIG0RGsZxqKRQmkAIBxBoRtREnQu21r+t56ZaYJUAGb1UBmdAVnXo5g7R0MqnHZjwX5RFzmaglgCgJAhzdZoSrVdbAlAl5n1jA6AWXuG0aA3LEuQDrLXjqpvWFbgI2-Pb5CCWiS39azkBna+sIsAgEGcSYReBtaHAxzJnvjFtpB7dxBf1dQe0V5ni+r4rjeAgSjBb0ZgurbgJ+HZvgk98PaJXkN7aG1F4ahxWEjEaDBUboyAree8EdjxuRqATROj0yYtXQLtXG6caZsDpmTHO5J86VwHiAdmI8xbc3LuSQuwt9q0JvHeU0mNnwiQforZWOAAEa3rDrOWq854mydh3NAFthGPztv-U2EjUCu3dsAr2ZEhKUX9oHBCUDIysOQXgyOaV5Sx3jrNBUSdsEp1wZTAhmd6YzC-lQhhVci40K5mOXmFdGF82YVzPR7C-xcNSK3NeG8u4c17s4yhEwh6+MOhPRsU8f6iP8vIg+qBl7SMVvwzeBUd57wPu-PMJ9QBnz-tfNJt975ZN-rIip4j0lv15jAT+ucY4-3KS-BRQDPZGI1sqQm5isFbRKKnPatiiFr1IUzKJQsnHF1oR4mQXiXFMIWX4pBATOGSE8ZEWZ1c4ni2fJLRuMsp4hJyeE8skT+5zJiWNdZ8SGwnRqSky53DQkKIylvYOu997qyKcfMup9fTnzqV09J1T2mr06Tk12FtmmtIYR08FOSenWSAA
Any help much appreciated!
What you're trying to do isn't logically possible. You have faceted on country. That means each country gets a line (working), a symbol (working) but how would it get a rule where the start point is one country and the end point is the other. One group does not know anything about the other group so you couldn't have a rule spanning the two countries.
If you want to keep your facet, you can do the following:
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"description": "A basic line chart example.",
"width": 500,
"height": 200,
"padding": 5,
"signals": [],
"data": [
{
"name": "bombers",
"url": "https://gist.githubusercontent.com/vdvoorder/5b30997d8708dda783bb2b95d2e9ef34/raw/Bomber%2520Gap.csv",
"format": {
"type": "csv",
"parse": {"Total bombers": "number", "Year": "number"}
},
"transform": [
{
"type": "formula",
"as": "date",
"expr": "time(datetime(datum.Year, 1, 1))"
},
{"type": "filter", "expr": "datum.Year <= 1980"}
]
},
{
"name": "bombers2",
"source": "bombers",
"transform": [
{
"type": "pivot",
"field": "Country",
"value": "Total bombers",
"groupby": ["date"]
}
]
}
],
"scales": [
{
"name": "x",
"type": "time",
"range": "width",
"domain": {"data": "bombers", "field": "date"}
},
{
"name": "y",
"type": "linear",
"range": "height",
"nice": true,
"zero": true,
"domain": {"data": "bombers", "field": "Total bombers"}
},
{
"name": "color",
"type": "ordinal",
"range": "category",
"domain": {"data": "bombers", "field": "Country"}
}
],
"axes": [
{"orient": "bottom", "scale": "x"},
{"orient": "left", "scale": "y"}
],
"marks": [
{
"type": "group",
"from": {
"facet": {"name": "series", "data": "bombers", "groupby": "Country"}
},
"marks": [
{
"description": "Line for evolution of total bombers by country",
"type": "line",
"from": {"data": "series"},
"encode": {
"enter": {
"x": {"scale": "x", "field": "date"},
"y": {"scale": "y", "field": "Total bombers"},
"stroke": {"scale": "color", "field": "Country"},
"strokeCap": {"value": "round"},
"strokeWidth": {"value": 3},
"strokeOpacity": {"value": 0.5}
}
}
},
{
"description": "Points for total bombers by country",
"type": "symbol",
"from": {"data": "series"},
"encode": {
"enter": {
"x": {"scale": "x", "field": "date"},
"y": {"scale": "y", "field": "Total bombers"},
"size": {"value": 50},
"fill": {"scale": "color", "field": "Country"},
"strokeWidth": {"value": 20},
"stroke": {"value": "lightskyblue"}
},
"update": {
"fillOpacity": {"value": 1},
"strokeOpacity": {"value": 0}
},
"hover": {"strokeOpacity": {"value": 1}}
}
}
]
},
{
"description": "Rulers between country total bomber numbers",
"type": "rule",
"from": {"data": "bombers2"},
"encode": {
"update": {
"x": {"scale": "x", "field": "date"},
"y": {"scale": "y", "field": "Soviet Union"},
"y2": {"scale": "y", "field": "United States"},
"stroke": {"value": "lightskyblue"},
"strokeWidth": {"value": 3},
"strokeOpacity": {"value": 0.5}
}
}
}
]
}

Can I partially color a bar based on percentage complete on a temporal axis?

I am trying to create a Gantt chart and I want to color a single task with two colors, based on a percentage complete. Say, make the complete part green and the remaining part orange.
How can I achieve this?
Below is a sample code, also available in the editor here.
{
"data": {
"values": [
{"Description": "Task 1", "Start": "2023-01-05", "End": "2023-01-10", "Percentage complete": 0},
{"Description": "Task 2", "Start": "2023-01-01", "End": "2023-01-15", "Percentage complete": 75},
{"Description": "Task 3", "Start": "2023-01-01", "End": "2023-01-03", "Percentage complete": 100}
]
},
"layer": [
{
"mark": "bar",
"encoding": {
"y": {
"field": "Description",
"type": "ordinal",
"stack": null
},
"x": {
"field": "Start",
"type": "temporal"
},
"x2": {
"field": "End",
"type": "temporal"
}
}
}
]
}
The expected result should look like this.
I tried looking at folding, transforming, and scale. But as I am new to Vega-lite, to no avail.
You have two options.
Reshape your data upstream. Your partially coloured bars should be rendered as two bars stacked - one for incomplete and one for complete.
Use Reactive Geometry as described here. This may need Vega rather than VL.
Here it is using reactive geometry.
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"background": "white",
"padding": 5,
"width": 200,
"style": "cell",
"data": [
{
"name": "source_0",
"values": [
{
"Description": "Task 1",
"Start": "2023-01-05",
"End": "2023-01-10",
"Percentatecomplete": 0
},
{
"Description": "Task 2",
"Start": "2023-01-01",
"End": "2023-01-15",
"Percentatecomplete": 0.75
},
{
"Description": "Task 3",
"Start": "2023-01-01",
"End": "2023-01-03",
"Percentatecomplete": 1
}
]
},
{
"name": "data_0",
"source": "source_0",
"transform": [
{"type": "formula", "expr": "toDate(datum[\"Start\"])", "as": "Start"},
{"type": "formula", "expr": "toDate(datum[\"End\"])", "as": "End"},
{
"type": "filter",
"expr": "(isDate(datum[\"Start\"]) || (isValid(datum[\"Start\"]) && isFinite(+datum[\"Start\"])))"
}
]
}
],
"signals": [
{"name": "y_step", "value": 20},
{
"name": "height",
"update": "bandspace(domain('y').length, 0.1, 0.05) * y_step"
}
],
"marks": [
{
"name": "layer_0_marks",
"type": "rect",
"style": ["bar"],
"from": {"data": "data_0"},
"encode": {
"update": {
"fill": {"value": "#4c78a8"},
"x": {"scale": "x", "field": "Start"},
"x2": {"scale": "x", "field": "End"},
"y": {"scale": "y", "field": "Description"},
"height": {"signal": "max(0.25, bandwidth('y'))"}
}
}
},
{
"type": "rect",
"from": {"data": "layer_0_marks"},
"encode": {
"update": {
"x": {"field": "x"},
"y": {"field": "y"},
"fill": {"value": "red"},
"width": {"signal": "(datum.x2 - datum.x) * datum.datum.Percentatecomplete"},
"height": {"signal": "max(0.25, bandwidth('y'))"}
}
}
}
],
"scales": [
{
"name": "x",
"type": "time",
"domain": {"data": "data_0", "fields": ["Start", "End"]},
"range": [0, {"signal": "width"}]
},
{
"name": "y",
"type": "band",
"domain": {"data": "data_0", "field": "Description", "sort": true},
"range": {"step": {"signal": "y_step"}},
"paddingInner": 0.1,
"paddingOuter": 0.05
}
],
"axes": [
{
"scale": "x",
"orient": "bottom",
"gridScale": "y",
"grid": true,
"tickCount": {"signal": "ceil(width/40)"},
"domain": false,
"labels": false,
"aria": false,
"maxExtent": 0,
"minExtent": 0,
"ticks": false,
"zindex": 0
},
{
"scale": "x",
"orient": "bottom",
"grid": false,
"title": "Start, End",
"labelFlush": true,
"labelOverlap": true,
"tickCount": {"signal": "ceil(width/40)"},
"zindex": 0
},
{
"scale": "y",
"orient": "left",
"grid": false,
"title": "Description",
"zindex": 0
}
]
}

How to visualize two rectangles in Power BI

How to display two rectangles, on inside the other in a Power BI visual? Of course, given rectangle coordinates and sizes. Preferably using native visuals.
Example:
Bigger rectangle (frame) size is width:10 hight:8
Inside Rectangle size is width:3, hight:2, x:4, y:5
I do not care about the display of the numbers or axes. Just the blue and red rectangles.
In case you change your mind, here is a Vega-Lite version. You can literally just drop the code into Deneb and don't need to do anything else.
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"width": 300,
"height": 240,
"background": "#9bc2e6",
"data": {"values": [{"x": 3, "x2": 6, "y": 4, "y2": 6}]},
"mark": {"type": "rect", "color": "#c00000"},
"encoding": {
"x": {
"field": "x",
"type": "quantitative",
"scale": {"domain": [0, 10]},
"axis": {
"gridColor": "white",
"gridWidth": 1,
"domain": false,
"title": "x",
"orient": "top"
}
},
"x2": {"field": "x2"},
"y": {
"field": "y",
"type": "quantitative",
"scale": {"domain": [8, 0]},
"axis": {
"gridColor": "white",
"gridWidth": 1,
"domain": false,
"title": "y"
}
},
"y2": {"field": "y2"}
}
}
Edit:
You mean like this?
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"width": 300,
"height": 240,
"background": "white",
"layer": [
{
"data": {"values": [{"rect":1,"x": 0, "x2": 10, "y": 0, "y2": 8}]},
"mark": {"type": "rect", "color": "#9bc2e6"}
},
{
"data": {"values": [{"rect":2, "x": 3, "x2": 6, "y": 4, "y2": 6}]},
"mark": {"type": "rect", "color": "#c00000"}
}
],
"encoding": {
"x": {
"field": "x",
"type": "quantitative",
"scale": {"domain": [0, 10]},
"axis": null
},
"x2": {"field": "x2"},
"y": {
"field": "y",
"type": "quantitative",
"scale": {"domain": [8, 0]},
"axis": null
},
"y2": {"field": "y2"}
}
}

Deneb plot (Vega-Lite) for Power BI: How to use an free scale y-axis with facet

I am using Deneb custom visual to repeat visual for different tasks. Is it possible to only show the relevent Y-axis values. Following data is used:
The following Vega-lite JSON is used:
{
"data": {"name": "dataset"},
"mark": {
"type": "bar",
"opacity": 1,
"tooltip": true,
"cornerRadius": 15
},
"encoding": {
"x": {
"field": "Earliest StartDate",
"type": "temporal"
},
"y": {
"field": "MachGrpCode",
"type": "nominal",
"axis": {
"title": null,
"grid": true,
"tickBand": "extent"
}
},
"row": {
"field": "ProdHeaderOrdNr",
"header": {"labelAngle": 0}
}
},
"resolve": {
"axis": {
"x": "independent",
"y": "independent"
}
}
}
Which results in:
Is it possible to only use the relevent task values (for 022 --> erase 6700 row)?
From what I've seen, this is a Vega bug. The recommended work-around is to use vconcat with a filter transform. If you only have a few ProdHeaderOrdNr, this is doable.
Open the Chart in the Vega Editor

Power BI - Deneb chart showing tooltips in reverse

I've created a simple stacked bar chart in Deneb where the user can highlight in place: x-axis is group, highlight is tiers. I've also created a tooltip that should show the name for each bar and should match the label on the bar. What's strange is that the tooltip shows in reverse order: pointing to A shows D, F shows E, etc. (See this pbix file.) I've attempted to insert sorting to the bars; that didn't work. My preference is to have the bars remain as they are and the tooltips show to match; however, it would be ok (less desirable) to reverse the order of the bars. How can I get the tooltip to match the label?
This cleaned up spec works.
Don't forget to accept the answer if this solves your problem.
{
"data": {"name": "dataset"},
"transform": [
{
"stack": "test2",
"as": ["a", "b"],
"groupby": ["group"]
}
],
"layer": [
{
"mark": {
"type": "bar",
"stroke": "black",
"strokeWidth": 1,
"opacity": 0.3
},
"encoding": {
"color": {
"field": "group",
"type": "nominal",
"scale": {
"domain": [
"Low",
"Med",
"High"
],
"range": [
"#e15759",
"#ffff00",
"#59a14f"
]
},
"legend": null
}
}
},
{
"mark": {
"type": "bar",
"stroke": "black",
"strokeWidth": 1,
"tooltip": true
},
"encoding": {
"color": {
"field": "group",
"type": "nominal",
"scale": {
"domain": [
"Low",
"Med",
"High"
],
"range": [
"#e15759",
"#ffff00",
"#59a14f"
]
},
"legend": null
},
"opacity": {
"condition": {
"test": "datum['test2__highlight']!=null",
"value": 1
},
"value": 0
}
}
},
{
"mark": {
"type": "text",
"color": "black",
"dy": -90
},
"encoding": {
"text": {"field": "name"}
}
}
],
"encoding": {
"y": {
"field": "a",
"type": "quantitative",
"axis": {
"title": "Number of Projects",
"tickMinStep": 1
}
},
"y2": {"field": "b"},
"x": {
"field": "group",
"type": "nominal",
"axis": {
"title": null,
"labelAngle": 0
}
}
}
}