Пример построения диаграммы F#

Вы хотите интерполяцию между первым и вторым цветом. Интерполяция цветов легка путем вычисления той же интерполяции для каждого из ее компонентов (R, G, B). Существует много способов интерполировать. Самое легкое должно использовать линейную интерполяцию: просто возьмите процент p первого цвета и процента 1 - p второго:

R = firstCol.R * p + secondCol.R * (1 - p)

существует другой вопрос связаны с этим.

существуют другие методы интерполяции, это иногда работает лучше. Например, с помощью колоколообразный (сигмовидный) функция интерполяции делает переход более гладким.

РЕДАКТИРОВАНИЕ/: ой, Вы означаете использовать предопределенную функцию. Хорошо, еще легче. Сообщение в блоге, которое Вы связали теперь, имеет пример кода в Python.

В Java, Вы могли использовать GradientPaint .

6
задан Peter 28 November 2009 в 10:18
поделиться

2 ответа

Вот кое-что, что я разгадал с помощью Google Chart API, Я надеюсь, что код достаточно ясен без дополнительных объяснений:

//Built with F# 1.9.7.8
open System.IO
open System.Net
open Microsoft.FSharp.Control.WebExtensions
//Add references for the namespaces below if you're not running this code in F# interactive
open System.Drawing 
open System.Windows.Forms 

let buildGoogleChartUri input =
    let chartWidth, chartHeight = 250,100

    let labels,data = List.unzip input
    let dataString = 
        data 
        |> List.map (box>>string) //in this way, data can be anything for which ToString() turns it into a number
        |> List.toArray |> String.concat ","

    let labelString = labels |> List.toArray |> String.concat "|"

    sprintf "http://chart.apis.google.com/chart?chs=%dx%d&chd=t:%s&cht=p3&chl=%s"
            chartWidth chartHeight dataString labelString

//Bake a bitmap from the google chart URI
let buildGoogleChart myData =
    async {
        let req = HttpWebRequest.Create(buildGoogleChartUri myData)
        let! response = req.AsyncGetResponse()
        return new Bitmap(response.GetResponseStream())
    } |> Async.RunSynchronously

//invokes the google chart api to build a chart from the data, and presents the image in a form
//Excuse the sloppy winforms code
let test() =
    let myData = [("John",34);("Sara",30);("Will",20);("Maria",16)]

    let image = buildGoogleChart myData
    let frm = new Form()
    frm.BackgroundImage <- image
    frm.BackgroundImageLayout <- ImageLayout.Center
    frm.ClientSize <- image.Size
    frm.Show()
8
ответ дан 8 December 2019 в 17:23
поделиться

It's easy to do "made in home" pie chart: open System.Drawing

let red = new SolidBrush(Color.Red) in
let green = new SolidBrush(Color.Green) in
let blue = new SolidBrush(Color.Blue) in
let rec colors =
  seq {
    yield red
    yield green
    yield blue
    yield! colors
  }


let pie data (g: Graphics) (r: Rectangle) =
  let vals = 0.0 :: List.map snd data
  let total = List.sum vals
  let angles = List.map (fun v -> v/total*360.0) vals
  let p = new Pen(Color.Black,1)
  Seq.pairwise vals |> Seq.zip colors |> Seq.iter (fun (c,(a1,a2)) -> g.DrawPie(p,r,a1,a2); g.FillPie(c,r,a1,a2))
3
ответ дан 8 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: