FSharpChart: две шкалы на одном графике

Я использую FSharpChart для печати на одном графике скользящей средней и объема акции. Проблема в том, что один график увеличивается от 20 до 50, а другой - от 0 до 80 млн, поэтому, когда я объединяю два, один делится на дно, и это бесполезно. Могу ли я иметь две разные шкалы на оси Y, чтобы два графических элемента "слились" правильно?

2 ответа

Решение

Вы можете сделать это, если вы установите AxisType одной из серий AxisType.Secondary, Конечно, вы должны убедиться, что метки осей, условные обозначения и т. Д. Прояснят, какие карты данных соответствуют каким масштабам.

open FSharp.Charting
open System.Windows.Forms.DataVisualization.Charting

let squaresChart = [ 1 .. 100 ] |> List.map (fun n -> (n, n*n)) |> Chart.Line
let cubesChart   = [ 1 .. 100 ] |> List.map (fun n -> (n, n*n*n)) |> Chart.Line

let bad = 
    [ squaresChart 
      cubesChart ]
    |> Chart.Combine

let good = 
    [ squaresChart
      cubesChart |> Chart.WithSeries.AxisType(YAxisType = AxisType.Secondary) ]
    |> Chart.Combine

Плохой:

введите описание изображения здесь

Хорошо:

введите описание изображения здесь

Это работает, но в быстром тестировании, которое я сделал, чтобы написать этот ответ, выясняется, что в FSharp.Charting есть некоторые ошибки, из-за которых определенные настройки являются "заразными". После создания "хорошего" графика теперь появляется дополнительная ось, даже когда я не хочу ее:

// secondary axis sticks around
bad |> Chart.WithTitle(Text = "Why secondary axis?")

// now the title and the secondary axis *both* stick around!
Chart.Rows [bad; good]

введите описание изображения здесьвведите описание изображения здесь

Насколько я знаю, вы не можете Chart.Combine графики с независимыми шкалами. Однако вы можете сложить их друг с другом с помощью другого комбинатора, например, с помощью Chart.Rows как в фрагменте ниже

#I @"C:\code\packages\FSharp.Charting.0.90.12"
#load "FSharp.Charting.fsx"

open FSharp.Charting
open System

let parabola = [ for x in 1.0 .. 1.0 .. 10.0 -> (x, (x ** 2.0) * 1000.0 ) ]
let curve = [ for i in 0.0 .. 0.02 .. 2.0 * Math.PI -> (sin i, cos i * sin i) ] 

Chart.Rows([Chart.Line(parabola); Chart.Line(curve)])

составление комбинированной диаграммы с компонентами, имеющими совершенно разные масштабы:

введите описание изображения здесь

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