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)
вызов этого на вашем графике позволит вам визуализировать диаграмму без всплывающих окон.