{-# LANGUAGE TypeSynonymInstances, NoMonomorphismRestriction #-} {-| Import this module to generate charts using the Google Chart API. For more examples, refer to @Examples.hs@ in the source tarball, or download it directly from Github : <http://github.com/deepakjois/hs-gchart/blob/master/examples/Examples.hs>. For documentation regarding the full data model, refer to "Graphics.GChart.Types". For more information about the Google Chart API, refer to <http://code.google.com/apis/chart/> -} module Graphics.GChart ( module Graphics.GChart.Types, -- * Setting Chart Parameters {-| Use these functions to set the parameters of the chart. These functions must be called inside a @do@ block, which can then be passed onto 'getChartUrl' or 'getChartData'. For e.g, here is a simple pie chart function @ generatePieChart = getChartUrl $ do setChartSize 640 400 setChartType Pie setChartTitle \"Test\" addChartData ([1,2,3,4,5]::[Int]) addColor \"FF0000\" setLegend $ legend [\"t1\",\"t2\", \"t3\",\"t4\",\"t5\"] setLabels $ [\"Test 1\", \"Test 2\", \"Test 3\", \"Test 4\", \"Test 5\"] @ -} setChartSize, setChartType, setDataEncoding, setChartTitle, setChartTitleWithColor, setChartTitleWithColorAndFontSize, addChartData, addChartDataXY, setColors, addColor, addFill, setLegend, addAxis, setGrid, setLabels, setBarWidthSpacing, makeShapeMarker, makeRangeMarker, makeFinancialMarker, addShapeMarker, addRangeMarker, addFinancialMarker, -- * Retrieving Chart data getChartData, getChartUrl, convertToUrl, -- * Smart Constructors -- | These functions can be used to construct chart -- parameters more conveniently solid, legend, legendWithPosition, makeAxis, makeGrid, simple, text, extended, automatic, automaticWithSpacing, barwidth, barwidthspacing, relative ) where import Graphics.GChart.Types import Graphics.GChart.ChartItems import Graphics.GChart.DataEncoding import Data.List {- Smart Constructors -} -- | generates a 'Solid' fill from a hex color value solid = Fill . Solid -- | generates a 'ChartLegend' from a list of labels legend :: [String] -> ChartLegend legend labels = Legend labels Nothing -- | generats a 'ChartLegend' from a list of lables and a 'LegendPosition' legendWithPosition :: [String] -> LegendPosition -> ChartLegend legendWithPosition labels position = Legend labels (Just position) {-| returns a default axis. Use this to override the fields with your own values. For e.g : @ makeAxis { 'axisType' = 'AxisTop', 'axisLabels' = [\"0\",\"50\",\"100\"] } @ -} makeAxis :: Axis makeAxis = defaultAxis {-| returns a default axis. Use this to override the fields with your own values. For e.g : @ makeGrid { 'xAxisStep' = 10, 'yAxisStep' = 10, xOffset = Just 5 } @ -} makeGrid :: ChartGrid makeGrid = defaultGrid -- | Use this to specify the 'Simple' encoding for the 'setDataEncoding' -- function. simple :: ChartData simple = Simple [] -- | Use this to specify the 'Text' encoding for the 'setDataEncoding' -- function. text :: ChartData text = Text [] -- | Use this to specify the 'Extended' encoding for the 'setDataEncoding' -- function. extended :: ChartData extended = Extended [] -- | Set automatic bar width for bar chart automatic :: BarChartWidthSpacing automatic = (Just Automatic,Nothing) -- | Set automatic bar width for bar chart, with spacing values automaticWithSpacing :: Int -> Int -> BarChartWidthSpacing automaticWithSpacing b g= (Just Automatic, Just (Fixed (b,g))) -- | Set bar width for chart barwidth :: Int -> BarChartWidthSpacing barwidth n = (Just (BarWidth n), Nothing) -- | Set bar width and spacing for chart barwidthspacing :: Int -> Int -> Int -> BarChartWidthSpacing barwidthspacing bw b g = (Just (BarWidth bw), Just (Fixed (b,g))) -- | Set relative spacing relative :: Float -> Float -> BarChartWidthSpacing relative b g = (Nothing, Just (Relative (b,g))) -- | Shape Marker makeShapeMarker :: ShapeMarker makeShapeMarker = defaultShapeMarker -- | Range Marker makeRangeMarker :: RangeMarker makeRangeMarker = defaultRangeMarker -- | Financial Marker makeFinancialMarker :: FinancialMarker makeFinancialMarker = defaultFinancialMarker {- Setting Chart Parameters-} -- | Set the chart size by passing the width and the height in pixels -- For e.g : @setChartSize 320 200@ setChartSize :: Int -> Int -> ChartM () setChartSize w h = set (Size w h) -- | Set the chart type by passing a 'ChartType' setChartType :: ChartType -> ChartM () setChartType = set -- | Set the chart title by passing a 'ChartTitle' setChartTitle :: String -> ChartM () setChartTitle title = set $ ChartTitle title Nothing Nothing -- | Set the chart title with a color setChartTitleWithColor :: String -> Color -> ChartM() setChartTitleWithColor title color = set $ ChartTitle title (Just color) Nothing -- | Set the chart title with color and font size setChartTitleWithColorAndFontSize :: String -> Color -> FontSize -> ChartM () setChartTitleWithColorAndFontSize title color fontsize = set $ ChartTitle title (Just color) (Just fontsize) {-| Use it with 'simple', 'text' or 'extended' to specify the encoding. For e.g @ setDataEncoding simple @ Make sure you pass in values of the right type, Int for simple and extended encoding, and Float for text encoding. -} setDataEncoding :: ChartData -> ChartM () setDataEncoding = set {-| Add data to chart. Make sure you have set the data encoding using 'setDataEncoding' before calling this function, otherwise it may generate gibberish, or throw an error -} addChartData :: ChartDataEncodable a => [a] -> ChartM () addChartData = addDataToChart -- | Works like 'addChartData', but for XY datasets for line XY chart etc addChartDataXY :: ChartDataEncodable a => [(a,a)] -> ChartM () addChartDataXY series = do addDataToChart xseries addDataToChart yseries where xseries = map fst series yseries = map snd series -- | Pass a list of colors corresponding to the datasets in the chart setColors :: [Color] -> ChartM () setColors = set . ChartColors {-| Add a color to the chart. This color will be added to the list 'ChartColors'. Make sure you do not include a call to 'setColors' at any time after a call to 'addColor', since this will lead to all previous values being erased. -} addColor :: Color -> ChartM() addColor = addColorToChart -- | Add a 'Fill' to the chart addFill :: Fill -> ChartM () addFill = addFillToChart -- | Set a Legend for the chart setLegend :: ChartLegend -> ChartM () setLegend = set -- | Add an 'Axis' to the chart addAxis :: Axis -> ChartM () addAxis = addAxisToChart -- | Set a 'ChartGrid' for the chart setGrid :: ChartGrid -> ChartM () setGrid = set -- | Adds a shape marker. Use `makeShapeMarker` smart constructor when calling -- this function If value of data set index is not specified when using -- 'makeShapeMarker', it automatically adds a data index to refer to the latest -- data set addShapeMarker :: ShapeMarker -> ChartM () addShapeMarker marker | (shapeDataSetIdx marker) > -1 = addMarker marker | otherwise = do idx <- getDataSetIdx let newmarker = marker { shapeDataSetIdx = idx } addMarker marker -- | Adds a range marker. You can use 'makeRangeMarker' smart constructor when -- calling this function addRangeMarker :: RangeMarker -> ChartM () addRangeMarker marker = addMarker marker -- | Adds a financial marker. User `makeFinancialMarker` smart constructor when -- calling this function. If value of data set index is not specified when using -- 'makeFinancialMarker', it automatically adds a data index to refer to the latest -- data set addFinancialMarker :: FinancialMarker -> ChartM () addFinancialMarker marker | (financeDataSetIdx marker) > -1 = addMarker marker | otherwise = do idx <- getDataSetIdx let newmarker = marker { financeDataSetIdx = idx } addMarker marker -- | Set labels for the chart setLabels :: [String] -> ChartM () setLabels = set . ChartLabels -- | Set bar and width spacing setBarWidthSpacing :: BarChartWidthSpacing -> ChartM () setBarWidthSpacing = set {- Retrieving Chart Data -} -- | Extracts the data out of the monad and returns a value of type 'Chart' getChartData :: ChartM () -> Chart getChartData = getChartDataFromChartM -- | Extracts the data out of the monad and returns a URL string for the chart getChartUrl :: ChartM () -> String getChartUrl = convertToUrl . getChartData -- | Converts a value of type 'Chart' to a URL convertToUrl :: Chart -> String convertToUrl chart = baseURL ++ intercalate "&" urlparams where baseURL = "http://chart.apis.google.com/chart?" urlparams = [urlEnc a ++ "=" ++ urlEnc b | (a,b) <- getParams chart]