Skip to content

Commit 5dc4c93

Browse files
committed
finish ohlc chart
1 parent 38e17dc commit 5dc4c93

File tree

4 files changed

+186
-83
lines changed

4 files changed

+186
-83
lines changed

src/Plotly.NET/ChartAPI/Chart2D.fs

Lines changed: 61 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2551,28 +2551,40 @@ module Chart2D =
25512551
low : #IConvertible seq,
25522552
close : #IConvertible seq,
25532553
x : #IConvertible seq,
2554-
[<Optional;DefaultParameterValue(null)>]?Increasing : Line,
2555-
[<Optional;DefaultParameterValue(null)>]?Decreasing : Line,
2556-
[<Optional;DefaultParameterValue(null)>]?Tickwidth : float,
2557-
[<Optional;DefaultParameterValue(null)>]?Line : Line,
2558-
[<Optional;DefaultParameterValue(null)>]?XCalendar : StyleParam.Calendar,
2559-
[<Optional;DefaultParameterValue(true)>] ?UseDefaults : bool
2554+
[<Optional;DefaultParameterValue(null)>] ?Name : string,
2555+
[<Optional;DefaultParameterValue(null)>] ?ShowLegend : bool,
2556+
[<Optional;DefaultParameterValue(null)>] ?Opacity : float,
2557+
[<Optional;DefaultParameterValue(null)>] ?Text : #IConvertible,
2558+
[<Optional;DefaultParameterValue(null)>] ?MultiText : seq<#IConvertible>,
2559+
[<Optional;DefaultParameterValue(null)>] ?Line : Line,
2560+
[<Optional;DefaultParameterValue(null)>] ?IncreasingColor : Color,
2561+
[<Optional;DefaultParameterValue(null)>] ?Increasing : FinanceMarker,
2562+
[<Optional;DefaultParameterValue(null)>] ?DecreasingColor : Color,
2563+
[<Optional;DefaultParameterValue(null)>] ?Decreasing : FinanceMarker,
2564+
[<Optional;DefaultParameterValue(null)>] ?TickWidth : float,
2565+
[<Optional;DefaultParameterValue(true)>] ?UseDefaults : bool
25602566
) =
25612567

25622568
let useDefaults = defaultArg UseDefaults true
2563-
2569+
let increasing = Increasing |> Option.defaultValue (FinanceMarker.init()) |> FinanceMarker.style(?LineColor = IncreasingColor)
2570+
let decreasing = Decreasing |> Option.defaultValue (FinanceMarker.init()) |> FinanceMarker.style(?LineColor = DecreasingColor)
2571+
25642572
Trace2D.initOHLC(
25652573
Trace2DStyle.OHLC(
2566-
``open`` = ``open`` ,
2567-
high = high ,
2568-
low = low ,
2569-
close = close ,
2570-
x = x ,
2571-
?Increasing = Increasing ,
2572-
?Decreasing = Decreasing ,
2573-
?Tickwidth = Tickwidth ,
2574-
?Line = Line ,
2575-
?XCalendar = XCalendar
2574+
Open = ``open``,
2575+
High = high,
2576+
Low = low,
2577+
Close = close,
2578+
X = x,
2579+
?Name = Name ,
2580+
?ShowLegend = ShowLegend,
2581+
?Opacity = Opacity ,
2582+
?Text = Text ,
2583+
?MultiText = MultiText ,
2584+
?Line = Line ,
2585+
Increasing = increasing,
2586+
Decreasing = decreasing,
2587+
?TickWidth = TickWidth
25762588
)
25772589
)
25782590
|> GenericChart.ofTraceObject useDefaults
@@ -2594,31 +2606,43 @@ module Chart2D =
25942606
static member OHLC
25952607
(
25962608
stockTimeSeries: seq<System.DateTime*StockData>,
2597-
[<Optional;DefaultParameterValue(null)>] ?Increasing : Line,
2598-
[<Optional;DefaultParameterValue(null)>] ?Decreasing : Line,
2599-
[<Optional;DefaultParameterValue(null)>] ?Tickwidth : float,
2600-
[<Optional;DefaultParameterValue(null)>] ?Line : Line,
2601-
[<Optional;DefaultParameterValue(null)>] ?XCalendar : StyleParam.Calendar,
2602-
[<Optional;DefaultParameterValue(true)>] ?UseDefaults : bool
2609+
[<Optional;DefaultParameterValue(null)>] ?Name : string,
2610+
[<Optional;DefaultParameterValue(null)>] ?ShowLegend : bool,
2611+
[<Optional;DefaultParameterValue(null)>] ?Opacity : float,
2612+
[<Optional;DefaultParameterValue(null)>] ?Text : #IConvertible,
2613+
[<Optional;DefaultParameterValue(null)>] ?MultiText : seq<#IConvertible>,
2614+
[<Optional;DefaultParameterValue(null)>] ?Line : Line,
2615+
[<Optional;DefaultParameterValue(null)>] ?IncreasingColor : Color,
2616+
[<Optional;DefaultParameterValue(null)>] ?Increasing : FinanceMarker,
2617+
[<Optional;DefaultParameterValue(null)>] ?DecreasingColor : Color,
2618+
[<Optional;DefaultParameterValue(null)>] ?Decreasing : FinanceMarker,
2619+
[<Optional;DefaultParameterValue(null)>] ?TickWidth : float,
2620+
[<Optional;DefaultParameterValue(true)>] ?UseDefaults : bool
26032621
) =
26042622

26052623
let useDefaults = defaultArg UseDefaults true
26062624

2607-
Trace2D.initOHLC(
2608-
Trace2DStyle.OHLC(
2609-
``open`` = (stockTimeSeries |> Seq.map (snd >> (fun x -> x.Open))) ,
2610-
high = (stockTimeSeries |> Seq.map (snd >> (fun x -> x.High))) ,
2611-
low = (stockTimeSeries |> Seq.map (snd >> (fun x -> x.Low))) ,
2612-
close = (stockTimeSeries |> Seq.map (snd >> (fun x -> x.Close))) ,
2613-
x = (stockTimeSeries |> Seq.map fst) ,
2614-
?Increasing = Increasing ,
2615-
?Decreasing = Decreasing ,
2616-
?Tickwidth = Tickwidth ,
2617-
?Line = Line ,
2618-
?XCalendar = XCalendar
2619-
)
2625+
Chart.OHLC(
2626+
``open`` = (stockTimeSeries |> Seq.map (snd >> (fun x -> x.Open))) ,
2627+
high = (stockTimeSeries |> Seq.map (snd >> (fun x -> x.High))) ,
2628+
low = (stockTimeSeries |> Seq.map (snd >> (fun x -> x.Low))) ,
2629+
close = (stockTimeSeries |> Seq.map (snd >> (fun x -> x.Close))) ,
2630+
x = (stockTimeSeries |> Seq.map fst),
2631+
?Name = Name ,
2632+
?ShowLegend = ShowLegend ,
2633+
?Opacity = Opacity ,
2634+
?Text = Text ,
2635+
?MultiText = MultiText ,
2636+
?Line = Line ,
2637+
?IncreasingColor= IncreasingColor,
2638+
?Increasing = Increasing ,
2639+
?DecreasingColor= DecreasingColor,
2640+
?Decreasing = Decreasing ,
2641+
?TickWidth = TickWidth ,
2642+
?UseDefaults = UseDefaults
26202643
)
2621-
|> GenericChart.ofTraceObject useDefaults
2644+
2645+
26222646

26232647
/// Creates a candlestick chart. A candlestick cart is a style of financial chart used to describe price movements of a
26242648
/// security, derivative, or currency. Each "candlestick" typically shows one day, thus a one-month chart may show the 20

src/Plotly.NET/Playground.fsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,42 @@ open Plotly.NET
176176
open System
177177
open Plotly.NET
178178

179+
#r "nuget: FSharp.Data"
180+
#r "nuget: Deedle"
181+
182+
open FSharp.Data
183+
open Deedle
184+
185+
let data =
186+
Http.RequestString @"https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv"
187+
|> fun csv -> Frame.ReadCsvString(csv,true,separators=",")
188+
189+
let openData : seq<float> = data.["AAPL.Open"] |> Series.values
190+
let highData : seq<float> = data.["AAPL.High"] |> Series.values
191+
let lowData : seq<float> = data.["AAPL.Low"] |> Series.values
192+
let closeData : seq<float> = data.["AAPL.Close"] |> Series.values
193+
let dateData = data |> Frame.getCol "Date" |> Series.values |> Seq.map System.DateTime.Parse
194+
195+
Chart.OHLC(
196+
openData |> Seq.take 30,
197+
highData |> Seq.take 30,
198+
lowData |> Seq.take 30,
199+
closeData |> Seq.take 30,
200+
dateData |> Seq.take 30
201+
)
202+
|> Chart.show
203+
204+
Chart.OHLC(
205+
openData,
206+
highData,
207+
lowData,
208+
closeData,
209+
dateData,
210+
IncreasingColor = Color.fromKeyword Cyan,
211+
DecreasingColor = Color.fromKeyword Gray
212+
)
213+
|> Chart.show
214+
179215
// Generate linearly spaced vector
180216
let linspace (min,max,n) =
181217
if n <= 2 then failwithf "n needs to be larger then 2"

src/Plotly.NET/Traces/ObjectAbstractions/FinanceMarker.fs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,29 @@ type FinanceMarker () =
1313
(
1414
[<Optional;DefaultParameterValue(null)>] ?MarkerColor: Color,
1515
[<Optional;DefaultParameterValue(null)>] ?LineColor: Color,
16-
[<Optional;DefaultParameterValue(null)>] ?LineWidth: float
16+
[<Optional;DefaultParameterValue(null)>] ?LineWidth: float,
17+
[<Optional;DefaultParameterValue(null)>] ?LineDash: StyleParam.DrawingStyle
1718
) =
1819
FinanceMarker ()
1920
|> FinanceMarker.style
2021
(
21-
?MarkerColor = MarkerColor,
22-
?LineColor = LineColor ,
23-
?LineWidth = LineWidth
22+
?MarkerColor= MarkerColor,
23+
?LineColor = LineColor ,
24+
?LineWidth = LineWidth ,
25+
?LineDash = LineDash
2426

2527
)
2628

2729
static member style
2830
(
2931
[<Optional;DefaultParameterValue(null)>] ?MarkerColor: Color,
3032
[<Optional;DefaultParameterValue(null)>] ?LineColor: Color,
31-
[<Optional;DefaultParameterValue(null)>] ?LineWidth: float
33+
[<Optional;DefaultParameterValue(null)>] ?LineWidth: float,
34+
[<Optional;DefaultParameterValue(null)>] ?LineDash: StyleParam.DrawingStyle
3235
) =
3336
(fun (financeMarker: FinanceMarker) ->
3437
let marker = Marker.init(?Color = MarkerColor)
35-
let line = Line.init(?Color = LineColor, ?Width = LineWidth)
38+
let line = Line.init(?Color = LineColor, ?Width = LineWidth, ?Dash = LineDash)
3639

3740
marker |> DynObj.setValue financeMarker "marker"
3841
line |> DynObj.setValue financeMarker "line"

src/Plotly.NET/Traces/Trace2D.fs

Lines changed: 80 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -706,21 +706,6 @@ type Trace2DStyle() =
706706
)
707707

708708

709-
710-
711-
712-
713-
714-
715-
716-
717-
718-
719-
720-
721-
722-
723-
724709
// Applies the styles of histogram to TraceObjects
725710
static member Histogram
726711
(
@@ -1634,32 +1619,87 @@ type Trace2DStyle() =
16341619
/// ?XCalendar : Sets the calendar system to use with `x` date data.
16351620
static member OHLC
16361621
(
1637-
``open`` : #IConvertible seq,
1638-
high : #IConvertible seq,
1639-
low : #IConvertible seq,
1640-
close : #IConvertible seq,
1641-
x : #IConvertible seq,
1642-
[<Optional;DefaultParameterValue(null)>] ?Increasing : Line,
1643-
[<Optional;DefaultParameterValue(null)>] ?Decreasing : Line,
1644-
[<Optional;DefaultParameterValue(null)>] ?Line : Line,
1645-
[<Optional;DefaultParameterValue(null)>] ?Tickwidth : float,
1646-
[<Optional;DefaultParameterValue(null)>] ?XCalendar : StyleParam.Calendar
1622+
[<Optional;DefaultParameterValue(null)>] ?Name : string,
1623+
[<Optional;DefaultParameterValue(null)>] ?Visible : StyleParam.Visible,
1624+
[<Optional;DefaultParameterValue(null)>] ?ShowLegend : bool,
1625+
[<Optional;DefaultParameterValue(null)>] ?LegendRank : int,
1626+
[<Optional;DefaultParameterValue(null)>] ?LegendGroup : string,
1627+
[<Optional;DefaultParameterValue(null)>] ?LegendGroupTitle : Title,
1628+
[<Optional;DefaultParameterValue(null)>] ?Opacity : float,
1629+
[<Optional;DefaultParameterValue(null)>] ?Ids : seq<#IConvertible>,
1630+
[<Optional;DefaultParameterValue(null)>] ?X : seq<#IConvertible>,
1631+
[<Optional;DefaultParameterValue(null)>] ?Close : seq<#IConvertible>,
1632+
[<Optional;DefaultParameterValue(null)>] ?Open : seq<#IConvertible>,
1633+
[<Optional;DefaultParameterValue(null)>] ?High : seq<#IConvertible>,
1634+
[<Optional;DefaultParameterValue(null)>] ?Low : seq<#IConvertible>,
1635+
[<Optional;DefaultParameterValue(null)>] ?Text : #IConvertible,
1636+
[<Optional;DefaultParameterValue(null)>] ?MultiText : seq<#IConvertible>,
1637+
[<Optional;DefaultParameterValue(null)>] ?HoverText : string,
1638+
[<Optional;DefaultParameterValue(null)>] ?MultiHoverText : seq<string>,
1639+
[<Optional;DefaultParameterValue(null)>] ?HoverInfo : StyleParam.HoverInfo,
1640+
[<Optional;DefaultParameterValue(null)>] ?XHoverFormat : string,
1641+
[<Optional;DefaultParameterValue(null)>] ?YHoverFormat : string,
1642+
[<Optional;DefaultParameterValue(null)>] ?Meta : string,
1643+
[<Optional;DefaultParameterValue(null)>] ?CustomData : seq<#IConvertible>,
1644+
[<Optional;DefaultParameterValue(null)>] ?XAxis : StyleParam.LinearAxisId,
1645+
[<Optional;DefaultParameterValue(null)>] ?YAxis : StyleParam.LinearAxisId,
1646+
[<Optional;DefaultParameterValue(null)>] ?XPeriod : #IConvertible,
1647+
[<Optional;DefaultParameterValue(null)>] ?XPeriodAlignment : StyleParam.PeriodAlignment,
1648+
[<Optional;DefaultParameterValue(null)>] ?XPeriod0 : #IConvertible,
1649+
[<Optional;DefaultParameterValue(null)>] ?YPeriod : #IConvertible,
1650+
[<Optional;DefaultParameterValue(null)>] ?YPeriodAlignment : StyleParam.PeriodAlignment,
1651+
[<Optional;DefaultParameterValue(null)>] ?YPeriod0 : #IConvertible,
1652+
[<Optional;DefaultParameterValue(null)>] ?Line : Line,
1653+
[<Optional;DefaultParameterValue(null)>] ?SelectedPoints : seq<#IConvertible>,
1654+
[<Optional;DefaultParameterValue(null)>] ?Increasing : FinanceMarker,
1655+
[<Optional;DefaultParameterValue(null)>] ?Decreasing : FinanceMarker,
1656+
[<Optional;DefaultParameterValue(null)>] ?HoverLabel : Hoverlabel,
1657+
[<Optional;DefaultParameterValue(null)>] ?TickWidth : float,
1658+
[<Optional;DefaultParameterValue(null)>] ?XCalendar : StyleParam.Calendar,
1659+
[<Optional;DefaultParameterValue(null)>] ?YCalendar : StyleParam.Calendar,
1660+
[<Optional;DefaultParameterValue(null)>] ?UIRevision : string
1661+
16471662
) =
1648-
(fun (trace:('T :> Trace)) ->
1649-
DynObj.setValue trace "open" ``open``
1650-
DynObj.setValue trace "high" high
1651-
DynObj.setValue trace "low" low
1652-
DynObj.setValue trace "close" close
1653-
DynObj.setValue trace "x" x
1654-
DynObj.setValue trace "xaxis" "x"
1655-
DynObj.setValue trace "yaxis" "y"
1656-
DynObj.setValueOpt trace "increasing" Increasing
1657-
DynObj.setValueOpt trace "decreasing" Decreasing
1658-
DynObj.setValueOpt trace "tickwidth" Tickwidth
1659-
DynObj.setValueOpt trace "line" Line
1660-
DynObj.setValueOpt trace "xcalendar" XCalendar
1661-
1662-
trace
1663+
(fun (ohlc:('T :> Trace)) ->
1664+
1665+
Name |> DynObj.setValueOpt ohlc "name"
1666+
Visible |> DynObj.setValueOptBy ohlc "visible" StyleParam.Visible.convert
1667+
ShowLegend |> DynObj.setValueOpt ohlc "showlegend"
1668+
LegendRank |> DynObj.setValueOpt ohlc "legendrank"
1669+
LegendGroup |> DynObj.setValueOpt ohlc "legendgroup"
1670+
LegendGroupTitle |> DynObj.setValueOpt ohlc "legendgrouptitle"
1671+
Opacity |> DynObj.setValueOpt ohlc "opacity"
1672+
Ids |> DynObj.setValueOpt ohlc "ids"
1673+
X |> DynObj.setValueOpt ohlc "x"
1674+
Close |> DynObj.setValueOpt ohlc "close"
1675+
Open |> DynObj.setValueOpt ohlc "open"
1676+
High |> DynObj.setValueOpt ohlc "high"
1677+
Low |> DynObj.setValueOpt ohlc "low"
1678+
(Text, MultiText) |> DynObj.setSingleOrMultiOpt ohlc "text"
1679+
(HoverText, MultiHoverText) |> DynObj.setSingleOrMultiOpt ohlc "hovertext"
1680+
HoverInfo |> DynObj.setValueOptBy ohlc "hoverinfo" StyleParam.HoverInfo.convert
1681+
XHoverFormat |> DynObj.setValueOpt ohlc "xhoverformat"
1682+
YHoverFormat |> DynObj.setValueOpt ohlc "yhoverformat"
1683+
Meta |> DynObj.setValueOpt ohlc "meta"
1684+
CustomData |> DynObj.setValueOpt ohlc "customdata"
1685+
XAxis |> DynObj.setValueOptBy ohlc "xaxis" StyleParam.LinearAxisId.convert
1686+
YAxis |> DynObj.setValueOptBy ohlc "yaxis" StyleParam.LinearAxisId.convert
1687+
XPeriod |> DynObj.setValueOpt ohlc "xperiod"
1688+
XPeriodAlignment |> DynObj.setValueOptBy ohlc "xperiodalignment" StyleParam.PeriodAlignment.convert
1689+
XPeriod0 |> DynObj.setValueOpt ohlc "xperiod0"
1690+
YPeriod |> DynObj.setValueOpt ohlc "yperiod"
1691+
YPeriodAlignment |> DynObj.setValueOptBy ohlc "yperiodalignment" StyleParam.PeriodAlignment.convert
1692+
YPeriod0 |> DynObj.setValueOpt ohlc "yperiod0"
1693+
Line |> DynObj.setValueOpt ohlc "line"
1694+
Increasing |> DynObj.setValueOpt ohlc "increasing"
1695+
Decreasing |> DynObj.setValueOpt ohlc "decreasing"
1696+
HoverLabel |> DynObj.setValueOpt ohlc "hoverlabel"
1697+
TickWidth |> DynObj.setValueOpt ohlc "tickwidth"
1698+
XCalendar |> DynObj.setValueOptBy ohlc "xcalendar" StyleParam.Calendar.convert
1699+
YCalendar |> DynObj.setValueOptBy ohlc "ycalendar" StyleParam.Calendar.convert
1700+
UIRevision |> DynObj.setValueOpt ohlc "uirevision"
1701+
1702+
ohlc
16631703
)
16641704

16651705

0 commit comments

Comments
 (0)