Getting a Good Grasp of F# (仮)

関数型言語F#をもっと楽しみたい

F#でなるべく簡単にグラフ表示をさせたい その3

名前空間:System.Windows.Forms.DataVisualization.Chartingのクラスを使って.NET標準ライブラリのみでグラフを描いてみます。

Windowsフォーム(Formオブジェクト)に下図のような階層で必要なオブジェクトを追加していきます。

Form
ChartControl
ChartArea(データのプロット領域、座標軸やグリッド線の設定)
Title(タイトル)
Series(グラフデータその1)
Series(グラフデータその2)
Legend(凡例)

sin(x)とcos(x)のグラフを描くコードの例

  1. open System.Drawing
  2. open System.Windows.Forms
  3. open System.Windows.Forms.DataVisualization.Charting
  4. open System
  5. open System.Diagnostics
  6.  
  7. [<EntryPoint; STAThread>]
  8. let main _ =
  9.     let area = new ChartArea() in // チャートエリア
  10.     do  
  11.         area.Name <- "CHART_AREA"
  12.         // グリッドは灰色で破線
  13.         area.AxisX.MajorGrid.LineColor <- Color.LightGray
  14.         area.AxisX.MajorGrid.LineDashStyle <- ChartDashStyle.Dash
  15.  
  16.         area.AxisY.MajorGrid.LineColor <- Color.LightGray
  17.         area.AxisY.MajorGrid.LineDashStyle <- ChartDashStyle.Dash
  18.  
  19.         // グリッド間隔は0.2
  20.         area.AxisX.Interval <- 0.2
  21.         area.AxisY.Interval <- 0.2
  22.         // グリッド描画開始点をずらす
  23.         area.AxisX.IntervalOffset <- - (Math.PI |> Math.Floor |> (+) 0.2)
  24.  
  25.         // 描画範囲指定
  26.         area.AxisX.Minimum <- area.AxisX.IntervalOffset
  27.         area.AxisY.Minimum <- -1.0  
  28.         area.AxisY.Maximum <- 1.0
  29.  
  30.         // X軸とY軸を原点で交差させる
  31.         area.AxisX.Crossing <- 0.0
  32.         area.AxisY.Crossing <- 0.0
  33.  
  34.     let chartCtrl = new Chart() in
  35.     do  
  36.         let title = new Title("ここにチャートコントロールに表示するタイトルが入ります",
  37.                                 Docking.Top,
  38.                                 new Font("Meiryo", 12.0f),
  39.                                 Color.Brown)
  40.         chartCtrl.Titles.Add(title)
  41.         chartCtrl.Dock <- DockStyle.Fill
  42.  
  43.     chartCtrl.ChartAreas.Add(area)  // チャートコントロールにチャートエリアを追加
  44.  
  45.     let series1 = new Series() in // グラフその1
  46.     do  series1.ChartType <- SeriesChartType.Line  // 折れ線
  47.         series1.Color <- Color.Blue
  48.         series1.BorderWidth <- 2   // 線の太さ
  49.         series1.LegendText <- "sin x"
  50.  
  51.     chartCtrl.Series.Add(series1)  // チャートコントロールにグラフその1を追加
  52.  
  53.     let series2 = new Series() in // グラフその2
  54.     do  series2.ChartType <- SeriesChartType.Line  // 折れ線
  55.         series2.Color <- Color.Red
  56.         series2.BorderWidth <- 2  // 線の太さ
  57.         series2.LegendText <- "cos x"
  58.  
  59.     chartCtrl.Series.Add(series2)  // チャートコントロールにグラフその2を追加
  60.  
  61.     let legend = new Legend() in // 凡例
  62.     do  legend.Title <- "凡例"
  63.         legend.DockedToChartArea <- area.Name  // 凡例を描画するチャートエリアの名前を指定
  64.         legend.Alignment <- StringAlignment.Near
  65.     
  66.     chartCtrl.Legends.Add(legend)  // チャートコントロールに凡例を追加
  67.  
  68.     let mainForm = new Form(Visible = true,
  69.                             Width = 1200,
  70.                             Height = 600,
  71.                             Text= "標準ライブラリを用いたグラフの例")
  72.  
  73.     mainForm.Controls.Add(chartCtrl)  // フォームにチャートコントロールを追加
  74.  
  75.     (*** プロットするデータを準備 ***)
  76.     let horizData = [ for x in -Math.PI..0.02..Math.PI -> x ]
  77.     let vertData1 = [ for x in horizData -> Math.Sin x ]  
  78.     let vertData2 = [ for x in horizData -> Math.Cos x ]
  79.  
  80.     Debug.Assert(Seq.length horizData = Seq.length vertData1)
  81.     Debug.Assert(Seq.length horizData = Seq.length vertData2)
  82.  
  83.     series1.Points.DataBindXY (horizData, vertData1)
  84.     series2.Points.DataBindXY (horizData, vertData2)
  85.  
  86.     Application.Run(mainForm)
  87.     0 // 整数の終了コードを返します

Windowsフォームアプリケーションなので、プロジェクトのビルド出力の設定を「Windowsアプリケーション」に設定。

f:id:pongitsune:20160127182941p:plain

実行結果

f:id:pongitsune:20160127160000p:plain

 

F#でなるべく簡単にグラフ表示をさせたい その2

F#からgnuplotを利用するためのライブラリとしてFnuPlotというのがあります。(Funplotという似た名前のソフトウェアも存在するので検索する場合は注意)

FnuPlot 公式ページ:http://fsprojects.github.io/FnuPlot/

まだ(2015年11月現在)ベータ版のようですが、これをインストールしてグラフを描いてみます。
まず、Visual Studioのパッケージ・マネージャー・コンソールを使ってインストール。
(写真はVisual Studio 2013のツールメニュー)

f:id:pongitsune:20151107181934p:plain

パッケージマネージャーコンソールのプロンプトの後に
Install-Package FnuPlot -Pre
と手入力

f:id:pongitsune:20151107182428p:plain

ソースコード

プロジェクトに Fnuplot.dll への参照を追加しソースコードで Fnuplot をインポート(open)します。

open System
open FnuPlot
[<EntryPointSTAThread>]
do
    let GNUPLOT_PATH = @"D:\Program Files (x86)\gnuplot\bin\gnuplot.exe"
 
    use gp = new GnuPlot(GNUPLOT_PATH) 
    // タイトルのフォント指定
    gp.SendCommand "set title font 'Meiyrio UI,25'"
    // タイトル文字列指定
    gp.SendCommand """set title '"√x"および"x^2"のグラフ描画の例'"""
    // ラインスタイルの指定
    gp.SendCommand "set style line 1 linewidth 3 linecolor rgbcolor 'red'"
    gp.SendCommand "set style line 2 linewidth 3 linecolor rgbcolor 'green'"
    // 描画範囲を指定
    gp.SendCommand("set xr[0:1.5]")
    gp.SendCommand("set yr[0:1.5]")
    // グラフの描画 
    gp.SendCommand "plot sqrt(x) linestyle 1, x**2 linestyle 2"
      
    printfn "表示完了 何かキーを押してください"
    // キー入力待ち
    Console.ReadKey() |> ignore

変数GNUPLOT_PATH はファイル gnuplot.exe へのパスを表す文字列。インストール先を確認してパスを指定すること。

let GNUPLOT_PATH = @"D:\Program Files (x86)\gnuplot\bin\gnuplot.exe"

 実行結果

f:id:pongitsune:20151107183757p:plain

 

F#でなるべく簡単にグラフ表示をさせたい その1

グラフといってもここでは英語で言うgraphではなくchartのこと。ここではグラフ描画にオープンソース・ソフトのgnuplotを利用します。

まずはgnuplotを下記URLからダウンロードしてインストール。

http://www.gnuplot.info/gnuplot公式ページ)

 

GUIでグラフを表示するためのプログラムをVisual Studio2013を使ってF#プロジェクトを(コンソールアプリケーションとして)作成してみます。

ただしコンソールアプリとは言え、gnuplotGUIを表示してくれるためコンソール・ウィンドウとは別にグラフ描画ウィンドウドも表示されます。

// System.Diagnostics.ProcessStartInfoを使う方法
// Gnuplotを予めインストールしておく
// コンソールアプリとしてビルドすること
open System
open System.Diagnostics
[<EntryPointSTAThread>]
do
    let GNUPLOT_PATH = @"D:\Program Files (x86)\gnuplot\bin\gnuplot.exe"  // ここは個々人のインストール環境に依存
    let gpProc =
      new ProcessStartInfo(
            FileName = GNUPLOT_PATH, 
            UseShellExecute = false,
            CreateNoWindow = false, 
            RedirectStandardInput = true) 
      |> Process.Start
    // タイトルのフォント指定 Meiyrio UIなら日本語表示もできる
    gpProc.StandardInput.WriteLine "set title font 'Meiyrio UI,25'"
    // タイトル文字列指定
    gpProc.StandardInput.WriteLine """set title '"sin(x)"と"1/2 * cos(x)"のグラフ描画の例'"""
    // ラインスタイルの指定  ※インデックスは1以上であること
    gpProc.StandardInput.WriteLine "set style line 1 linewidth 3 linecolor rgbcolor 'red'"
    gpProc.StandardInput.WriteLine "set style line 2 linewidth 3 linecolor rgbcolor 'green'"
    // グラフの描画  ※浮動小数点を使う点に注意   1/2 -> 1.0/2.0
    gpProc.StandardInput.WriteLine "plot sin(x) linestyle 1, 1.0/2.0 * cos(x) linestyle 2"
      
    printfn "表示完了 何かキーを押してください"
    // キー入力待ち(これがないとgnuplotウィンドウがすぐに閉じてしまうため必要)
    Console.ReadKey() |> ignore

このとき、変数 GNUPLOT_PATH はファイル gnuplot.exeへのパスを表す文字列。インストール先を確認してパスを指定すること。

let GNUPLOT_PATH = @"D:\Program Files (x86)\gnuplot\bin\gnuplot.exe"

注意)Windows版には wgnuplot.exe というよく似た名前の実行ファイルも存在するのでそちらと間違えないように。

実行結果

f:id:pongitsune:20151105201744j:plain

コンソール画面も同時に開いているので、ここに何かキー入力をするとアプリケーションは終了します。

f:id:pongitsune:20151105204816j:plain