2013-10-29 33 views
6

當F#互動運行,我期待下面的代碼創建一個簡單的餅圖,並將其保存到磁盤:FSharpChart.SaveAs()保存,如果調用之前的圖表繪製完成空白圖像

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

然而, 「test.png」中實際保存的是空白圖像。如果我將圖表輸入FShartChart.SaveAs函數,也會發生同樣的情況。但是,如果我首先執行圖表創建代碼並在手動執行SaveAs之前給圖表繪製時間以進行渲染,則圖像將按預期保存。

有沒有辦法阻止調用FSharpChart.Pie,直到渲染完成?我在Visual Studio 2013中使用FSharpChart.fsx版本0.60。

+1

FWIW,用於可視化的F#沒有這些併發性錯誤... –

回答

8

問題是底層圖表控件在將圖表保存到文件之前需要先顯示(這很愚蠢,但令人遺憾的是,F#圖表只是底層.NET圖表庫的輕量級封裝)。

我認爲你可以運行在F#中的兩個獨立線互動,或者你需要顯式調用顯示圖表的一些方法(我相信這是FSharpChart.Show或類似的東西)

我測試了這個使用F# Charting這是庫的新版本(有一些API的變化,但非常類似的想法),並以下工作(即使在一個單一的命令執行):

#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) 
+0

感謝您指向F#圖表。我看到的唯一小問題是上面的代碼片斷會導致顯示兩個圖表窗口,大概是Chart.Pie和一個來自pie.ShowChart()。但是,它爲我節省了手動爲大約十幾個圖表手動執行代碼片段的麻煩,這正是我所追求的。 –

1

我發現了以下工作得很好,不需要顯示。 (FSharp.Charting,V 0.90.14,.NET 4.5)

open FSharp.Charting 
// etc 
let prices = getPriceData() 
let chart = Chart.Candlestick(prices) 
Chart.Save @"C:\Charts\prices.png" chart 

更新

let renderChart ch = 
    let frm = new Form(Visible = false, TopMost = true, Width = 700, Height = 500) 
    let ctl = new ChartControl(ch, Dock = DockStyle.Fill) 
    frm.Controls.Add(ctl) 

調用此您定圖表上可以讓你呈現圖表,沒有任何形式的彈出窗口。