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)])
составление комбинированной диаграммы с компонентами, имеющими совершенно разные масштабы: