Creating Visual on Line and Clustered Column Chart - powerbi

I have line and clustered column chart (shown on "Graph" image) and I want to add a visual like drawn on "Graph" image
Clustered Columns : Planned Labor Data and Actual Labor Data
Lines : Cumulative Planned Labor data and Cumulative Labor Data
I keep data for both planned (P_Planned_Labor) and actual (Z_Labor) in 2 column table (date and data). Also I have a Date table (Z_Tarih) and it has only dates which has relation with planned and actual tables.
Dax Measures:
[Toplam Bugdeted] = Sum of Planned Bugdet
Columns;
Labor_Earned % İlerleme = DIVIDE(sum(Z_Labor[Değer]),[Toplam Budgeted],0) "percentage of actual labor of this week)
Labor_Plan % İlerleme = DIVIDE(SUM(P_Planned_Labor[Değer]),[Toplam Budgeted],0) "percentage of planned labor of this week)
Lines;
Labor_Earned Küm. % İlerleme = DIVIDE(CALCULATE(SUM(Z_Labor[Değer]),FILTER(ALL(Z_Tarih),Z_Tarih[Tarih]<=MAX(Z_Labor[Tarih]))),[Toplam Budgeted],0) "percentage of all actual from begining"
Labor_Plan Küm. % İlerleme = DIVIDE(CALCULATE(SUM(P_Planned_Labor[Değer]),FILTER(ALL(Z_Tarih),Z_Tarih[Tarih]<=MAX(Z_Tarih[Tarih]))),[Toplam Budgeted],0) "percentage of all planned from begining"
the chart i used doesnt allow (or i couldn't figure it out) to add visual which show difference value among lines.
Is there any chart that allow me to do that ?
or what measure should i add ?
Graph
Data

I think you simply can't achieve a chart like that (in which you plot the difference in that way), you will have to find a different way to show it.
for the difference itself, just create a measure like AB difference = [Measure A] - [Measure B], let's call it "difference"
Idea 1
you can then show the "difference" in the tooltip section, it will be visible only on hover (and you can put there as many differences as you want, one for "earned" and one for "planned"
Idea 2
Use the "Line and Stacked Column Chart", split the current chart in 2
In the "column values" put "labor" and "difference"
in the "line values" put the total value
This will allow seeing the current value and the difference like you asked BUT you won't be able to have multiple "categories" of measure in the same chart, as all the values will be stacked. therefore you will need to have one chart for "labor earned" and one for "labor planned".
You might want to put the 2 chart side by side (or one below the other) and maybe with a somehow fixed scale in order to make the comparison between the two easier

Related

Conditionally format a table based on average of dataset, but adhering to slicer selections

I have a simple CSV data set such as this.
ID,MainCategory,SubCategory,Type,Value
1,E,E1,Demo,5
2,N,N3,Install,2
3,E,E1,Demo,4
4,E,E2,Install,7
5,D,D1,Install,3
6,S,S2,PM,4
7,N,N2,Install,7
8,N,N2,Demo,1
9,E,E2,Demo,2
10,D,D2,Install,6
11,D,D3,PM,4
12,S,S1,PM,8
13,N,N1,Install,5
14,S,S3,Install,8
15,S,S1,Demo,9
16,E,E3,Demo,5
17,N,N2,Install,3
18,E,E2,PM,6
19,D,D2,PM,6
20,N,N3,Demo,6
21,S,S2,Demo,7
22,E,E3,Install,2
23,S,S1,Install,4
24,S,S2,PM,8
25,D,D1,Install,5
In my Power BI Desktop, I'd like to load this into a table, and conditionally format the Value column based on whether the value in each row is greater than or less than the average for the currently selected data set.
For instance, the average of Value considering the entire table is 5.08, so if there are no filters applied (as in, all my slicers are set to select nothing), I'd like all rows whose Value is 6 or more to be background colored in one color, and the others in another color. For this, I created two measures like so:
AvgOfVal = DIVIDE( SUM(G2G[Value]), COUNTA(G2G[ID]) )
BGColor = IF(SUM(G2G[Value]) > [AvgOfVal], "Light Pink", "Light Blue")
Then I tried to apply the BGColor measure for conditionally formatting the background, but this doesn't work as expected, and instead produces the result below.
I realize that this is due to the fact that the measure is calculated per row, so when conditional formatting is applied, as seen in the AvgOfVal column in the table, it calculates average per row instead of for the entire data set. How can I calculate a measure that takes into account the entire data set (considering slicers), and do the conditional formatting as I need.
Please keep in mind that if a user were to select a slicer filter (say, MainCategory = D), then I want the conditional formatting to reflect this. So in this case, given that AvgOfVal = 4.80 for MainCategory = D entries, I'd like all rows whose Value >= 5 to be in one color, and others in another color.
I realize that this is due to the fact that the measure is calculated per row
Yes. The key is understanding how that happens. When the measure is calculated a "context transition" happens and the current row is added to the filter context.
So what you want is a calculation that removes the row filter that was added in the context transition. So you need ALLSELECTED(), which does precisely that. eg
AvgOvVAl = CALCULATE( AVERAGE('data'[Value]), ALLSELECTED() )
Removing the "innermost" filter which in this case is the filter on the row, but leaving all other filters, ie filters added on the report, page, visual, or filters coming from interactions with other visuals like slicers.

Power BI - Conditionally format top/bottom cumulative percentage?

Looked around a long time now, and cannot find a way to conditionally format the values in a table, treemap, bar chart etc. if they are within the say, top 80% of all the values.
So let's say I have a table with sales and profit. Then I have a treemap showing the profit by city. I manage to get the percentage of total with:
% of total profit = SUM(Orders[Profit])/CALCULATE(SUM(Orders[Profit]),ALL(Orders))
..so that is no issue. But how would I go about formatting the cities that are within the top 80% of all profit? Any suggestion on approach?
Example:
Say I have the treemap below. The first four categories would fall within the top 80% of the total. Cumulatively it would be: 35%, 55%, 70% and 85%. So my need is to color only these in a specific way (and preferably any that falls outside of that range, in another color).
I take it that finding the logic to do this, likely though a measure somehow to base the formatting on, will then also be something that would be applicable to bar charts etc. (more traditional pareto).
OK, here is the solution. I will provide a traditional pareto and an adapted one according to your requirements. My data looks like this.
Create 3 measure as follows:
1
Profit Measure = SUM('Table'[Profit])
2
Pareto =
VAR amount = [Profit Measure]
VAR total = CALCULATE( [Profit Measure], REMOVEFILTERS('Table'))
VAR result = CALCULATE([Profit Measure], FILTER(ALL('Table'),[Profit Measure]>= amount))/total
RETURN result
3
Threshold =
VAR pareto = [Pareto]
VAR previousPareto = MAXX( FILTER( SUMMARIZE(ALL('Table'),'Table'[Order],'Table'[Profit],"p", [Pareto]), [p] < pareto), [Pareto])
RETURN IF( ISBLANK( previousPareto), pareto, previousPareto)
Create a table visual so you can see what is happening. In the table below, the Pareto measure is creating a cumulative percentage based on profit. If you were to use this, you can see that only A and B are cumulatively the only values actually < 80% and so they would be the only ones coloured. What you are asking for is slightly different which is what the threshold measure is showing. This outputs the previous pareto (or current if there is no previous).
In the tree map, I have created the conditional formatting as follows for standard pareto.
And as follows for the adapted pareto.
Click the fx icon under colors.
Select Rules for Format style, your measure as the field and then set up a rule (in your case, >= 0.2 for top 80%).

How to split graphs in two halves (15 days each)

I want to split graph in two halves of 15 day each using dates
i have tried using Top N filters Top and Bottom but when date range is changed i have duplicated graphs.
Split is happening using above filter but when i reduce date filter range duplicate data is shown in two graphs
i tried Flag = IF(DAY(MAX('Table'[Date]))<=15,1,2) as well but was getting data not in sequential order
I'm new to this any help will be thankful.
I just split it in half, rather than by 15 days. But you could change the math to use 15 days instead, if that's what you still want. Regardless, seeing this might help.
I started with a table like this, called Sheet1:
Then I created a chart like your original:
Then I created this DAX measure:
Chart Selector =
var minDate = CALCULATE(FIRSTDATE(Sheet1[Date]), ALL(Sheet1[Date]))
var maxDate = CALCULATE(LASTDATE(Sheet1[Date]), ALL(Sheet1[Date]))
var midDate = minDate + (DATEDIFF(minDate, maxDate, DAY)/2)
return
IF(CALCULATE(SUM(Sheet1[Date]),FILTER(Sheet1,Sheet1[Date]<=midDate)),"First","Second")
(You could change the midDate variable's calculation, above, to one that does 15 days instead.)
Then I made two copies of the chart and, in each copy, I added the new measure to the chart's filters. In the first chart's filter, I filtered for if it contains "First." For the second chart's filter, I filtered for if it contains "Second."
My end result looks like this:

Compare column values vs. measure from another table (scatterplot highlighting)

I'm trying to highlight points in a PowerBI report based on user input, based on http://sqljason.com/2018/03/highlighting-scatter-charts-in-power-bi-using-dax.html
My work so far is available at https://github.com/turbomam/measureIntoColumn/blob/master/mtminimal.pbix
My input data (Sheet1) consists of three columns: the name of a car, its fuel economy (mpg) and its engine displacement.
I have created another table (CarNames)
CarNames = SUMMARIZECOLUMNS(Sheet1[carname])
And added a measure to indicate the selected car
SelectedCar = SELECTEDVALUE(CarNames[carname])
I have added the following to my report (counter-clockwise from upper right):
a scatter plot of the fuel economy vs. engine displacement
a slicer based on CarNames[carname]
a card that confirms the values of the CarNames[SelectedCar] measure
Now I would like to highlight (not filter) the user-selected car on the scatterplot.
I thought I could create a new Boolean column for every row of Sheet1 by testing Sheet1[carname] against CarNames[SelectedCar]. Then I could use that Boolean value in the legend slot for my scatterplot and get a different color for the selected car.
CarSelected = if(Sheet1[carname] = CALCULATE(CarNames[SelectedCar]), TRUE, FALSE)
But when I go to the table viewer, all of the Sheet1[CarSelected] values are FALSE

power BI diaplay one value

I am using Power BI to bring together data from several systems and display a dash board with data from all of the systems.
The dashboard has a couple of filters which are then used to display the data relating to one object across all systems.
When the dashboard is first loaded and none of the filter have been selected, the data cards display information from all rows in the table.
Is there a way to make a data card only display one row of data?
or
Be blank if there are more than one row of data?
There's no direct way to look at the number of rows in the visual, count them, and do something different if there's more than 1.
That said, there are a few things you can do.
HASONEFILTER
If you have a specific column in your table that, when selected, filters your results to a single row, then you can check if there's a filter on that column using HASONEFILTER. (If you have multiple alternative columns,any of which filter to a single row, that's ok too.)
You could then create a measure for each column that tests HASONEFILTER. If true, return the MAX of the column. (The reason for MAX is because measures always have to aggregate, but the MAX of a 1-row column will be the same as the value in that column.) If false, return either BLANK() or an empty string, depending on your preference.
E.g.
ColumnAMeasure = IF(HASONEFILTER(Sheet1[Slicer Column]),MAX(Sheet1[COLUMN A]), "")
ColumnBMeasure = IF(HASONEFILTER(Sheet1[Slicer Column]),MAX(Sheet1[COLUMN B]), "")
where Sheet1 is the name of the table and "Slicer Column" is the name of the column being used as a slicer
HASONEVALUE
If you have multiple columns that could be used as filters in combination (meaning that having a filter applied on "Slicer Column" doesn't guarantee only 1 row in the table), then rather than testing HASONEFILTER, you can test HASONEVALUE.
ColumnAMeasure = IF(HASONEVALUE(Sheet1[COLUMN A]),MAX(Sheet1[COLUMN A]), "")
ColumnBMeasure = IF(HASONEVALUE(Sheet1[Column B]),MAX(Sheet1[COLUMN B]), "")
Notice that HASONEVALUE tests the current column you're trying to display, rather than a slicer column like HASONEFILTER.
One side-effect of HASONEVALUE is that, if you're filtered to 3 rows, but all 3 rows have the same value for column A, then column A will display that value. (Whereas with HASONEFILTER, column A would stay blank until you're filtered to one thing.)
Low Tech
Both answers above depend on a measure existing for every column you want to display, so that you can test whether to display a blank row or not. That could become a pain if you have dozens of columns.
A lower-tech alternative is to add in an additional row with blanks for each column and then sort your table so that that row always appears first. (And shorten your visual so only the top row is visible.) Technically the other rows would be underneath and there'd be a scrollbar, but at least the initial display would be blank rather than showing a random row.
Hopefully something here has helped. Other people might have better solutions too. More information:
HASONEFILTER documentation: https://msdn.microsoft.com/en-us/library/gg492135.aspx
HASONEVALUE documentation: https://msdn.microsoft.com/en-us/library/gg492190.aspx