Pie Chart
An example showing how to render a basic pie chart.
module PieChart exposing (main)
import Array exposing (Array)
import Color exposing (Color)
import Path
import Shape exposing (defaultPieConfig)
import TypedSvg exposing (g, svg, text_)
import TypedSvg.Attributes exposing (dy, fill, stroke, textAnchor, transform, viewBox)
import TypedSvg.Core exposing (Svg, text)
import TypedSvg.Types exposing (AnchorAlignment(..), Paint(..), Transform(..), em)
w : Float
w =
990
h : Float
h =
504
colors : Array Color
colors =
Array.fromList
[ Color.rgb255 152 171 198
, Color.rgb255 138 137 166
, Color.rgb255 123 104 136
, Color.rgb255 107 72 107
, Color.rgb255 159 92 85
, Color.rgb255 208 116 60
, Color.rgb255 255 96 0
]
radius : Float
radius =
min w h / 2
pieSlice : Int -> Shape.Arc -> Svg msg
pieSlice index datum =
Path.element (Shape.arc datum) [ fill <| Paint <| Maybe.withDefault Color.black <| Array.get index colors, stroke <| Paint Color.white ]
pieLabel : Shape.Arc -> ( String, Float ) -> Svg msg
pieLabel slice ( label, _ ) =
let
( x, y ) =
Shape.centroid { slice | innerRadius = radius - 40, outerRadius = radius - 40 }
in
text_
[ transform [ Translate x y ]
, dy (em 0.35)
, textAnchor AnchorMiddle
]
[ text label ]
view : List ( String, Float ) -> Svg msg
view model =
let
pieData =
model |> List.map Tuple.second |> Shape.pie { defaultPieConfig | outerRadius = radius }
in
svg [ viewBox 0 0 w h ]
[ g [ transform [ Translate (w / 2) (h / 2) ] ]
[ g [] <| List.indexedMap pieSlice pieData
, g [] <| List.map2 pieLabel pieData model
]
]
data : List ( String, Float )
data =
[ ( "/notifications", 2704659 )
, ( "/about", 4499890 )
, ( "/product", 2159981 )
, ( "/blog", 3853788 )
, ( "/shop", 14106543 )
, ( "/profile", 8819342 )
, ( "/", 612463 )
]
main : Svg msg
main =
view data