FSharpChart.SaveAs () сохраняет пустое изображение, если вызывается до завершения рендеринга диаграммы

При запуске в 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 до завершения рендеринга? Я использую FSharpChart.fsx версии 0.60 в Visual Studio 2013.

2 ответа

Решение

Проблема в том, что сначала необходимо отобразить базовый элемент управления диаграммой, прежде чем он сможет сохранить диаграмму в файл (это довольно глупо, но, к сожалению, диаграмма 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)

Я нашел следующее, чтобы работать хорошо, не требуя отображения. (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)

вызов этого на вашем графике позволит вам визуализировать диаграмму без всплывающих окон.

Другие вопросы по тегам