Udostępnij za pośrednictwem


FSharpChart release supporting Stacked Charts (version 0.60)

For the second release this week, FSharpChart now supports binding for Stacked Charts. As always, one can download the latest release from:

https://code.msdn.microsoft.com/FSharpChart-b59073f5 

In previous versions of FSharpChart it was not very intuitive how a Stacked Chart could be plotted. What one had to do was define a CombinedChart where one defines the charts to be combined with the same StackedGroupName property value:

let rndStacked = new System.Random()
let dataX() = [ for f in 1 .. 10 -> rndStacked.NextDouble() * 10.0]

FSharpChart.Combine
  [ FSharpChart.StackedBar100(dataX(), StackedGroupName = "g1")
    FSharpChart.StackedBar100(dataX(), StackedGroupName = "g1")
    FSharpChart.StackedBar100(dataX(), StackedGroupName = "g1") ]

This displays the following chart:

image

(Thanks to Tomas Petricek for this sample)

This approach also allows one to easily combine multiple Stacked Charts using different StackedGroupName properties:

FSharpChart.Combine
  [ FSharpChart.StackedBar(dataX(), StackedGroupName = "g1")
    FSharpChart.StackedBar(dataX(), StackedGroupName = "g1")
    FSharpChart.StackedBar(dataX(), StackedGroupName = "g1")
    FSharpChart.StackedBar(dataX(), StackedGroupName = "g2")
    FSharpChart.StackedBar(dataX(), StackedGroupName = "g2") ]

This displays the following chart:

image

However, for Stacked Charts, a more intuitive approach would be just to specify a list of data series. With this new release one can now specify the data series using the following formats:

list<list<'TY>>
list<list<'TX * 'TY>>

This now allows one to define, say a StackedColumn chart, using the much simpler expression:

let rndStacked = new System.Random()
let dataXY() = [ for f in 1 .. 10 -> (f, round (rndStacked.NextDouble() * 100.0))]

[dataXY(); dataXY(); dataXY()]
|> FSharpChart.StackedColumn
|> FSharpChart.WithSeries.DataPoint(Label="#VAL")

This displays the following chart:

image

Hopefully you will agree this is much simpler and more intuitive. The only current limitation of this binding approach is that one cannot use a CombinedChart for multiple Stacked Charts when binding in this fashion. If this is the desire then the previous approach with distinct StackedGroupName properties is needed.

The download also includes a new WinForms sample demonstrating how bindings can be managed for these Stacked Charts.

Don’t forget, the previous release also added the ability to add a Marker for a Data Series:

[ for i in 1. .. 20. .. 1000.0 -> i, rnd.NextDouble() ]
|> FSharpChart.Line
|> FSharpChart.WithSeries.Marker(Color=Color.Red, Style=MarkerStyle.Cross)

Again, the this displays the chart:

image

Once again enjoy!

Comments

  • Anonymous
    October 26, 2011
    Thanks for also incorporating my fix for maintaining area, margin, and legend options when combining charts
  • Anonymous
    October 27, 2011
    Hi Carl,Thanks for putting together FSharpChart. It is turning out to be very useful!I am trying to use the Funnel chart but the labels are not showing up. The labels do show if I use the same data against the Pie chart. Any ideas?Regards,Faisal
  • Anonymous
    October 31, 2011
    Try adding       |> FSharpChart.WithSeries.DataPoint(Label="#VAL")or if XY binding       |> FSharpChart.WithSeries.DataPoint(Label="#VALX")
  • Anonymous
    November 01, 2011
    Thanks Carl! That works.
  • Anonymous
    November 25, 2011
    Hi Carl,What is a good way of updating data on a combined chart? With a single chart it's relatively straightforward using SetData but I could not find anything obivous when using a combined chart.Regards,Faisal
  • Anonymous
    November 27, 2011
    The comment has been removed
  • Anonymous
    November 30, 2011
    The process for calling SetData for a stacked chart should be the same as for BoxPlot charts. The bindings are:   type StackedValue() =       inherit DataSourceSingleSeries()       member x.SetData(data: list<list<'TY>>, chartBinder:ChartBinder<string>) =           base.SetDataInternal(seqY data, chartBinder.Chart)       member x.SetData(data: list<list<'TX * 'TY>>, chartBinder:ChartBinder<string>) =           base.SetDataInternal(seqXY data, chartBinder.Chart)
  • Anonymous
    December 02, 2011
       let scatter = [(0.0,0.0)]   let line = [(0.0,0.0)]   let c = FSharpChart.Combine [               FSharpChart.Point(scatter)               FSharpChart.Line (line)           ]   let cd = ChartData.StackedValue()   cd.BindSeries(c.Chart.Series)If I try to use StackedValue this way then I get an error for BindSeries. The error is:"Binding multiple series to a data source object that supports only a single series"
  • Anonymous
    December 06, 2011
    The comment has been removed
  • Anonymous
    December 13, 2011
    Thanks Carl,I think it will be useful to 'overlay' some types of charts. For example, in machine learning you have raw data and a hypothesis function to fit the data. I would be useful to see both plotted together so that you can monitor how the 'learning' is progressing over time. I think Sho allows something like this but I would rather use FSharpChart.Please consider it as a feature request for your next set of enhancements.
  • Anonymous
    December 14, 2011
    Have you looked at Combined Charts. There are a few samples in the sample script and WinForms code.
  • Anonymous
    December 18, 2011
    The comment has been removed
  • Anonymous
    December 25, 2011
    The comment has been removed