Guest User

elm xD

a guest
Dec 12th, 2020
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Components.LineChart exposing (view)
  2.  
  3. import Axis
  4. import Color
  5. import Element as E
  6. import Path exposing (Path)
  7. import Scale exposing (ContinuousScale)
  8. import Shape
  9. import Time
  10. import TypedSvg exposing (g, svg)
  11. import TypedSvg.Attributes exposing (class, fill, stroke, transform, viewBox)
  12. import TypedSvg.Attributes.InPx exposing (strokeWidth)
  13. import TypedSvg.Core exposing (Svg)
  14. import TypedSvg.Types exposing (Paint(..), Transform(..))
  15.  
  16.  
  17. w : Float
  18. w =
  19.     900
  20.  
  21.  
  22. h : Float
  23. h =
  24.     450
  25.  
  26.  
  27. padding : Float
  28. padding =
  29.     30
  30.  
  31.  
  32. time_start : Int
  33. time_start =
  34.     1607731200000
  35.  
  36.  
  37. time_end : Int
  38. time_end =
  39.     time_start + 1000 * 60 * 60 * 24
  40.  
  41.  
  42. xScale : ContinuousScale Time.Posix
  43. xScale =
  44.     Scale.time Time.utc ( 0, w - 2 * padding ) ( Time.millisToPosix time_start, Time.millisToPosix time_end )
  45.  
  46.  
  47. yScale : ContinuousScale Float
  48. yScale =
  49.     Scale.linear ( h - 2 * padding, 0 ) ( 0, 3 )
  50.  
  51.  
  52. xAxis : Svg msg
  53. xAxis =
  54.     Axis.bottom [ Axis.tickCount 24 ] xScale
  55.  
  56.  
  57. yAxis : Svg msg
  58. yAxis =
  59.     Axis.left [ Axis.tickCount 3 ] yScale
  60.  
  61.  
  62. transformToLineData : ( Time.Posix, Float ) -> Maybe ( Float, Float )
  63. transformToLineData ( x, y ) =
  64.     Just ( Scale.convert xScale x, Scale.convert yScale y )
  65.  
  66.  
  67. line : List ( Time.Posix, Float ) -> Path
  68. line model =
  69.     List.map transformToLineData model
  70.         |> Shape.line (Shape.stepCurve 0)
  71.  
  72.  
  73. view : E.Element msg
  74. view =
  75.     E.html <|
  76.         svg [ viewBox 0 0 w h ] <|
  77.             [ g [ transform [ Translate (padding - 1) (h - padding) ] ]
  78.                 [ xAxis ]
  79.             , g [ transform [ Translate (padding - 1) padding ] ]
  80.                 [ yAxis ]
  81.             ]
  82.                 ++ List.indexedMap view_row time_series_list
  83.  
  84.  
  85. view_row : Int -> List ( Time.Posix, Float ) -> Svg a
  86. view_row index time_series =
  87.     g [ transform [ Translate padding padding ] ]
  88.         [ Path.element (line time_series) [ stroke <| Paint <| Color.rgb 0 0 0, strokeWidth 8, fill PaintNone ]
  89.         ]
  90.  
  91.  
  92. time_series_list : List (List ( Time.Posix, Float ))
  93. time_series_list =
  94.     [ [ ( Time.millisToPosix <| time_start + 3600000 * 0, 1 )
  95.       , ( Time.millisToPosix <| time_start + 3600000 * 1, 1 )
  96.       , ( Time.millisToPosix <| time_start + 3600000 * 2, 1 )
  97.       , ( Time.millisToPosix <| time_start + 3600000 * 3, 1 )
  98.       , ( Time.millisToPosix <| time_start + 3600000 * 4, 1 )
  99.       ]
  100.     , [ ( Time.millisToPosix <| time_start + 3600000 * 5, 1 )
  101.       , ( Time.millisToPosix <| time_start + 3600000 * 6, 1 )
  102.       ]
  103.     , [ ( Time.millisToPosix <| time_start + 3600000 * 0, 2 )
  104.       , ( Time.millisToPosix <| time_start + 3600000 * 24, 2 )
  105.       ]
  106.     ]
  107.  
Advertisement
Add Comment
Please, Sign In to add comment