Search code examples
f#dotnetchartingf#-charting

FSharpChart.SaveAs () saves blank image if called before chart rendering is complete


When run in F# Interactive, I expect the following code to create a simple pie chart and save it to disk:

let pie = FSharpChart.Pie([("Apples",1);("Oranges",2);("Bananas",3)])
FSharpChart.SaveAs "test.png" ChartImageFormat.Png pie

However, what actually gets saved in "test.png" is a blank image. The same happens if I pipe the chart into the FShartChart.SaveAs function. But if I first execute only the chart creation code and give the chart time to render before manually executing SaveAs, the image gets saved as expected.

Is there a way to block the call to FSharpChart.Pie until the rendering is complete? I'm using FSharpChart.fsx version 0.60 in Visual Studio 2013.


Solution

  • The problem is that the underlying chart control first needs to be displayed before it can save the chart to a file (this is pretty silly, but sadly, F# chart is just a lightweight wrapper over underlying .NET chart libraries).

    I think you can either run the two lines separately in F# interactive, or you need to explicitly call some method that displays the chart (I believe there is FSharpChart.Show or something like that)

    I tested this using F# Charting which is a newer version of the library (with some API changes, but very similar ideas) and the following works (even when executed all in a single command):

    #load @"packages\FSharp.Charting.0.87\FSharp.Charting.fsx"
    open FSharp.Charting
    
    let pie = Chart.Pie([("Apples",1);("Oranges",2);("Bananas",3)])
    pie.ShowChart()
    pie.SaveChartAs("D:\\temp\\test.png", ChartTypes.ChartImageFormat.Png)