6

在 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。

4

2 回答 2

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)
于 2013-10-29T04:33:11.883 回答
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)

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

于 2017-05-25T15:35:51.380 回答