## Calculating a Bar Graph Scale

I’m not sure if anyone will ever have an need for this, but just to share something interesting…

This morning I was tasked with coming up with a formula for calculating a bar graph scale, based off of the bar graph data. The scale had to include 3 to 4 numbers that indicate even portions of a maximum number. For example, if the maximum number in the bar graph is 95, then I had to come up with 25, 50, 75 and 100 in the scale; if the maximum number in the bar graph is 145, the I had to come up with 50, 100 and 150 in the scale, etc.

Here’s an example of a bar graph with 100 as the maximum number in the scale. The 4 number scale (not including 0) is on the left side:

Here’s an example of a bar graph with 150 as the maximum number in the scale. The 3 number scale (not including 0) is on the left side:

The first thing I needed to do was compile a list of numbers. Since my numbers were coming from thousands of records of data, I’ll fabricate some numbers to use for this demonstration.

'Create a list of Decimals

Dim list As New List(Of Decimal)

list.Add(94.2)

list.Add(64.8)

list.Add(45.4)

list.Add(20.1)

After I had the list of numbers, I created a scaleList to store a list of the numbers that would be added to my scale.

'Create a list of Integers to store our scale

Dim scaleList As New List(Of Integer)

The next thing I needed to do was figure out what the maximum number in the list was. So, I added a project reference to the System.Core.dll, then I was able to use LINQ’s Max() generic list extension to get it.

'Get the Max number in the list (using LINQ)

Dim max As Integer = CInt(list.Max())

Then, I had to get the number that is in the “ones” position of the max number.

'The ones variable will store the digit in the ones

' position of the integer

'

' Example: 12345 ("5" is in the ones position)

Dim ones As Integer = 0

'Extract number in the ones position

With max.ToString()

ones = CInt(.Substring(.Length - 1, 1))

End With

Once I had the maximum number, and the number from the “ones” position of the maximum number, I was able to calculate the ceiling for the numbers in the scale.

'Calculate the ceiling by subtracting ones from max

' and adding 10

'

' Example: 33

' (33 - 3) + 10 = 40 (40 is the ceiling)

Dim ceiling As Integer = (max - ones) + 10

The final thing to do was to figure out if the ceiling that I had was evenly divisible for 4 or 3. If it was, then I could calculate the numbers of the scale, but if it was not, then I needed to adjust my ceiling, and try again.

'The quotient stores the result of dividing

' the ceiling by 3 or 4

Dim quotient As Integer = 0

'Begin looping until we have a ceiling that

' is evenly divisible by 4 or 3,then create

' a scale list of integer.

Do

If ceiling Mod 4 = 0 Then

'Example: If the ceiling is 100,

' the(quotient = 25)

'

' quotient = 100 / 4

quotient = CInt(ceiling / 4)

'Add numbers to the scale

' (not adding 0, which is the min)

'

' Example: 25, 50, 75, 100

scaleList.Add(quotient)

scaleList.Add(quotient * 2)

scaleList.Add(quotient * 3)

scaleList.Add(quotient * 4)

Exit Do

ElseIf ceiling Mod 3 = 0 Then

'Example: If the ceiling is 150,

' the(quotient = 50)

'

' quotient = 150 / 3

quotient = CInt(ceiling / 3)

'Add numbers to the scale (not

' adding 0, which is the min)

'

' Example: 50, 100, 150

scaleList.Add(quotient)

scaleList.Add(quotient * 2)

scaleList.Add(quotient * 3)

Exit Do

Else

'If the number is not evenly divisible

' by 4 or 3 then add 10 to it.

'

' Example: 70

' 70 / 4 = 17.5

' 70 / 3 = 23.333333...

' 70 + 10 = 80 (add 10, because 70

' is not evenly divisible by 4 or 3)

'

' 80 / 4 = 20 <- 80 is the number we

' want, because 20 is evenly

' divisible by 4

ceiling += 10

End If

Loop

Now we have our list. To view the list, write it to the Output Window:

'Loop through each number in the list and write it

' to the Output Window

For Each i As Integer In scaleList

Debug.WriteLine(i) : Next

And there it is! Calculating a Bar Graph scale made easy!

## 0 comments: