FSharpChart.SaveAs()在图表渲染完成之前调用时保存空白图像

时间:2013-10-29 04:12:58

标签: f# dotnetcharting f#-charting

在F#Interactive中运行时,我希望以下代码创建一个简单的饼图并将其保存到磁盘:

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。

2 个答案:

答案 0 :(得分:8)

问题在于,在将图表保存到文件之前,首先需要显示基础图表控件(这非常愚蠢,但遗憾的是,F#图表只是基础.NET图表库的轻量级包装。) / p>

我认为你可以在F#interactive中分别运行两行,或者你需要显式调用一些显示图表的方法(我相信有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)

答案 1 :(得分: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)

在您给定的图表上调用此选项将允许您在没有任何表单弹出窗口的情况下呈现图表。