This came up in an IM conversation earlier today. Given a simple line chart, is it easy to add an average? Here is a quick way to do it. First, I'll start off with an array of data points. A query would work fine as well of course.
<cfset data = [ ["Apples", 50], ["Bananas", 40], ["Cherries", 72], ["Donuts", 59], ["Beers", 91] ]>
Now let's render the data as a series:
<cfchart chartheight="500" chartwidth="500" title="Test Chart">
<cfchartseries type="line" seriesLabel="Sales">
<cfloop index="datum" array="#data#">
<cfchartdata item="#datum[1]#" value="#datum[2]#">
</cfloop>
</cfchartseries>
</cfchart>
Which gives us:
Ok - easy enough. Now let's an add an average. I'm simply going to use a second series for the average. I need to do two things. One - I need to get an average. Since I'm looping over my data points I'll just do some basic math in the first loop. Secondly - I need to output a value for each unit from the first series. The value will be the same - the average - but the item will match up with the items in the first series. Here is the complete code sample.
<cfset data = [ ["Apples", 50], ["Bananas", 40], ["Cherries", 72], ["Donuts", 59], ["Beers", 91] ]> <cfchart chartheight="500" chartwidth="500" title="Test Chart">
<cfchartseries type="line" seriesLabel="Sales">
<cfset total = 0>
<cfloop index="datum" array="#data#">
<cfchartdata item="#datum[1]#" value="#datum[2]#">
<cfset total+= datum[2]>
</cfloop>
</cfchartseries>
<cfchartseries type="line" seriesLabel="Average Sales">
<cfset avg = total/arrayLen(data)>
<cfloop index="datum" array="#data#">
<cfchartdata item="#datum[1]#" value="#avg#">
</cfloop>
</cfchartseries>
</cfchart>
Obviously this could be done a bit cleaner, but you get the idea. Here is the result: