2013-10-29 13 views
6

F # Interactive içinde çalıştırdığınızda, aşağıdaki kod basit bir pasta grafik oluşturmak ve diske kaydetmek için bekliyoruz: AncakFSharpChart.SaveAs() grafik render tamamlanmadan önce denilen eğer boş resmi kaydeder

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

, aslında "test.png" dosyasına kaydedilen şey boş bir resimdir. Grafiği FShartChart.SaveAs işlevine aktarırsam, aynı şey olur. Ancak ilk önce yalnızca grafik oluşturma kodunu çalıştırırsam ve SaveA'ları manuel olarak çalıştırmadan önce oluşturulacak grafik zamanını verirseniz, görüntü beklendiği gibi kaydedilir.

İşleme tamamlanana kadar FSharpChart.Pie çağrısını engellemenin bir yolu var mı? Visual Studio 2013'te FSharpChart.fsx sürüm 0.60 kullanıyorum.

+1

FWIW, F # için Visualization bu eşzamanlılık hataları yok ... –

cevap

8

Sorun, temel grafik denetimi ilk önce grafik bir dosyaya kaydedebilmeniz için önce görüntülenmesi gerekir (Bu oldukça aptalca, ama ne yazık ki, F # grafik, temel .NET grafik kitaplıklarına göre hafif bir sarıcıdır).

Bu F# Charting kullanılarak test (I FSharpChart.Show veya buna benzer bir şey olduğuna inanıyoruz)

Sana interaktif F # ayrı iki satır çalıştırabilir ya mı, yoksa açıkça grafiği görüntüleyen bazı yöntemini çağırmak gerekir (tümü tek komutla idam bile) ve aşağıdaki işler (bazı API değişikliklerinin, ancak çok benzer fikirleri ile) kütüphanenin daha yeni bir sürümü olan: Ben de çalışmak için aşağıdaki bulduk

#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

Bana F # Charting doğru işaret ettiğiniz için teşekkür ederiz. Gördüğüm en küçük sorun, yukarıdaki kod snippet'inin büyük olasılıkla Chart.Pie'den bir tane ve bir tanesi de p..ShowChart() öğesinden görüntülenen iki grafik penceresiyle sonuçlanacağıdır. Bununla birlikte, bir düzine grafik için kod parçacıklarını el ile yürütme sıkıntısından kurtardım. –

1

, Görüntülemeye gerek yok. herhangi formlar açılır pencerelerin olmadan grafiği bahşeden size verilen grafikte bu çağıran

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) 

Güncelleme

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

(FSharp.Charting, v 0.90.14, 4.5 .net) .

İlgili konular