Copyright | Marco Zocca 2017 |
---|---|
License | BSD3 |
Maintainer | Marco Zocca <zocca marco gmail> |
Safe Haskell | None |
Language | Haskell2010 |
`plot-light` provides functionality for rendering vector graphics in SVG format. It is geared in particular towards scientific plotting, and it is termed "light" because it only requires a few common Haskell dependencies and no external libraries.
Usage
To use this project you just need `import Graphics.Rendering.Plot.Light`. If GHC complains of name clashes you can import the module in "qualified" form.
If you wish to try out the examples in this page, you will need to have these additional import statements:
import Text.Blaze.Svg.Renderer.String (renderSvg)
import qualified Data.Colour.Names as C
- rectCentered :: (Show a, RealFrac a) => Point a -> a -> a -> Maybe (Colour Double) -> Maybe (Colour Double) -> Svg
- circle :: (Real a1, Real a) => Point a1 -> a -> Maybe (Colour Double) -> Maybe (Colour Double) -> Svg
- line :: (Show a, RealFrac a) => Point a -> Point a -> a -> LineStroke_ a -> Colour Double -> Svg
- axis :: (Functor t, Foldable t, Show a, RealFrac a) => Axis -> a -> a -> Colour Double -> a -> Point a -> LineStroke_ a -> t (Point a) -> Svg
- text :: (Show a, Real a) => a -> Colour Double -> TextAnchor_ -> Text -> V2 a -> Point a -> Svg
- polyline :: (Foldable t, Show a1, Show a, RealFrac a, RealFrac a1) => t (Point a) -> a1 -> LineStroke_ a -> StrokeLineJoin_ -> Colour Double -> Svg
- data LineStroke_ a
- = Continuous
- | Dashed [a]
- data StrokeLineJoin_
- data TextAnchor_
- svgHeader :: Frame Int -> Svg -> Svg
- data Frame a = Frame {}
- data Point a = Point {}
- data LabeledPoint l a = LabeledPoint {}
- data Axis
- data V2 a = V2 a a
- data Mat2 a = Mat2 a a a a
- data DiagMat2 a = DMat2 a a
- diagMat2 :: Num a => a -> a -> Mat2 a
- origin :: Num a => Point a
- e1 :: Num a => V2 a
- e2 :: Num a => V2 a
- norm2 :: (Hermitian v, Floating n, n ~ InnerProduct v) => v -> n
- normalize2 :: (InnerProduct v ~ Scalar v, Floating (Scalar v), Hermitian v) => v -> v
- v2fromEndpoints :: Num a => Point a -> Point a -> V2 a
- v2fromPoint :: Num a => Point a -> V2 a
- movePoint :: Num a => V2 a -> Point a -> Point a
- moveLabeledPointV2 :: Num a => V2 a -> LabeledPoint l a -> LabeledPoint l a
- fromUnitSquare :: Num a => Frame a -> Point a -> Point a
- toUnitSquare :: (Fractional a, MatrixGroup (Mat2 a) (V2 a)) => Frame a -> Point a -> Point a
- class AdditiveGroup v where
- class AdditiveGroup v => VectorSpace v where
- class VectorSpace v => Hermitian v where
- type InnerProduct v :: *
- class Hermitian v => LinearMap m v where
- class MultiplicativeSemigroup m where
- class LinearMap m v => MatrixGroup m v where
- class Eps a where
Graphical elements
:: (Show a, RealFrac a) | |
=> Point a | Center coordinates |
-> a | Width |
-> a | Height |
-> Maybe (Colour Double) | Stroke colour |
-> Maybe (Colour Double) | Fill colour |
-> Svg |
A rectangle, defined by its center coordinates and side lengths
> putStrLn $ renderSvg $ rectCentered (Point 20 30) 15 30 (Just C.blue) (Just C.red) <g transform="translate(12.5 15.0)"><rect width="15.0" height="30.0" fill="#ff0000" stroke="#0000ff" /></g>
:: (Real a1, Real a) | |
=> Point a1 | Center |
-> a | Radius |
-> Maybe (Colour Double) | Stroke colour |
-> Maybe (Colour Double) | Fill colour |
-> Svg |
A circle
> putStrLn $ renderSvg $ circle (Point 20 30) 15 (Just C.blue) (Just C.red) <circle cx="20.0" cy="30.0" r="15.0" fill="#ff0000" stroke="#0000ff" />
:: (Show a, RealFrac a) | |
=> Point a | First point |
-> Point a | Second point |
-> a | Stroke width |
-> LineStroke_ a | Stroke type |
-> Colour Double | Stroke colour |
-> Svg |
Line segment between two Point
s
> putStrLn $ renderSvg $ line (Point 0 0) (Point 1 1) 0.1 Continuous C.blueviolet <line x1="0.0" y1="0.0" x2="1.0" y2="1.0" stroke="#8a2be2" stroke-width="0.1" />
> putStrLn $ renderSvg (line (Point 0 0) (Point 1 1) 0.1 (Dashed [0.2, 0.3]) C.blueviolet) <line x1="0.0" y1="0.0" x2="1.0" y2="1.0" stroke="#8a2be2" stroke-width="0.1" stroke-dasharray="0.2, 0.3" />
:: (Functor t, Foldable t, Show a, RealFrac a) | |
=> Axis | |
-> a | Length |
-> a | Stroke width |
-> Colour Double | Stroke colour |
-> a | Tick length fraction (w.r.t axis length) |
-> Point a | Axis center coordinate |
-> LineStroke_ a | |
-> t (Point a) | Tick center coordinates |
-> Svg |
An axis with tickmarks
> putStrLn $ renderSvg $ axis X 200 2 C.red 0.05 (Point 150 10) Continuous [Point 50 1, Point 60 1, Point 70 1] <line x1="50.0" y1="10.0" x2="250.0" y2="10.0" stroke="#ff0000" stroke-width="2.0" /><line x1="50.0" y1="5.0" x2="50.0" y2="15.0" stroke="#ff0000" stroke-width="2.0" /><line x1="60.0" y1="5.0" x2="60.0" y2="15.0" stroke="#ff0000" stroke-width="2.0" /><line x1="70.0" y1="5.0" x2="70.0" y2="15.0" stroke="#ff0000" stroke-width="2.0" />
:: (Show a, Real a) | |
=> a | Rotation angle of the frame |
-> Colour Double | Font colour |
-> TextAnchor_ | |
-> Text | Text |
-> V2 a | Displacement w.r.t. rotated frame |
-> Point a | Reference frame origin of the text box |
-> Svg |
text
renders text onto the SVG canvas
Conventions
The Point
argument p
refers to the lower-left corner of the text box.
After the text is rendered, its text box can be rotated by rot
degrees around p
and then optionally anchored.
The user can supply an additional V2
displacement which will be applied after rotation and anchoring and refers to the rotated text box frame.
> putStrLn $ renderSvg $ text (-45) C.green TAEnd "blah" (V2 (- 10) 0) (Point 250 0) <text x="-10.0" y="0.0" transform="translate(250.0 0.0)rotate(-45.0)" fill="#008000" text-anchor="end">blah</text>
:: (Foldable t, Show a1, Show a, RealFrac a, RealFrac a1) | |
=> t (Point a) | Data |
-> a1 | Stroke width |
-> LineStroke_ a | |
-> StrokeLineJoin_ | |
-> Colour Double | Stroke colour |
-> Svg |
Polyline (piecewise straight line)
> putStrLn $ renderSvg (polyline [Point 100 50, Point 120 20, Point 230 50] 4 (Dashed [3, 5]) Round C.blueviolet) <polyline points="100.0,50.0 120.0,20.0 230.0,50.0" fill="none" stroke="#8a2be2" stroke-width="4.0" stroke-linejoin="round" stroke-dasharray="3.0, 5.0" />
Element attributes
data LineStroke_ a Source #
Specify a continuous or dashed stroke
Continuous | |
Dashed [a] |
Eq a => Eq (LineStroke_ a) Source # | |
Show a => Show (LineStroke_ a) Source # | |
data StrokeLineJoin_ Source #
Specify the type of connection between line segments
data TextAnchor_ Source #
Specify at which end should the text be anchored to its current point
SVG utilities
Types
A frame, i.e. a bounding box for objects
A Point
defines a point in R2
data LabeledPoint l a Source #
A LabeledPoint
carries a "label" (i.e. any additional information such as a text tag, or any other data structure), in addition to position information. Data points on a plot are LabeledPoint
s.
Geometry
Vectors
V2 is a vector in R^2
V2 a a |
Eq a => Eq (V2 a) Source # | |
Show a => Show (V2 a) Source # | |
Num a => Monoid (V2 a) Source # | Vectors form a monoid w.r.t. vector addition |
Eps (V2 Double) Source # | |
Eps (V2 Float) Source # | |
Num a => Hermitian (V2 a) Source # | |
Num a => VectorSpace (V2 a) Source # | |
Num a => AdditiveGroup (V2 a) Source # | Vectors form an additive group |
Fractional a => MatrixGroup (DiagMat2 a) (V2 a) Source # | Diagonal matrices can always be inverted |
Num a => LinearMap (DiagMat2 a) (V2 a) Source # | |
Num a => LinearMap (Mat2 a) (V2 a) Source # | |
type InnerProduct (V2 a) Source # | |
type Scalar (V2 a) Source # | |
Matrices
A Mat2 can be seen as a linear operator that acts on points in the plane
Mat2 a a a a |
Diagonal matrices in R2 behave as scaling transformations
DMat2 a a |
Primitive elements
Vector operations
normalize2 :: (InnerProduct v ~ Scalar v, Floating (Scalar v), Hermitian v) => v -> v Source #
Normalize a V2 w.r.t. its Euclidean norm
Vector construction
v2fromEndpoints :: Num a => Point a -> Point a -> V2 a Source #
Create a V2 v
from two endpoints p1, p2. That is v
can be seen as pointing from p1
to p2
v2fromPoint :: Num a => Point a -> V2 a Source #
Build a V2 from a Point
p (i.e. assuming the V2 points from the origin (0,0) to p)
Operations on points
moveLabeledPointV2 :: Num a => V2 a -> LabeledPoint l a -> LabeledPoint l a Source #
Move a LabeledPoint
along a vector
toUnitSquare :: (Fractional a, MatrixGroup (Mat2 a) (V2 a)) => Frame a -> Point a -> Point a Source #
Typeclasses
class AdditiveGroup v where Source #
Additive group :
v ^+^ zero == zero ^+^ v == v
v ^-^ v == zero
Identity element
Group action ("sum")
Inverse group action ("subtraction")
Num a => AdditiveGroup (V2 a) Source # | Vectors form an additive group |
class AdditiveGroup v => VectorSpace v where Source #
Vector space : multiplication by a scalar quantity
Num a => VectorSpace (V2 a) Source # | |
class VectorSpace v => Hermitian v where Source #
Hermitian space : inner product
type InnerProduct v :: * Source #
(<.>) :: v -> v -> InnerProduct v Source #
Inner product
class Hermitian v => LinearMap m v where Source #
Linear maps, i.e. linear transformations of vectors
class MultiplicativeSemigroup m where Source #
Multiplicative matrix semigroup ("multiplying" two matrices together)
Num a => MultiplicativeSemigroup (DiagMat2 a) Source # | |
Num a => MultiplicativeSemigroup (Mat2 a) Source # | |
class LinearMap m v => MatrixGroup m v where Source #
The class of invertible linear transformations
Fractional a => MatrixGroup (DiagMat2 a) (V2 a) Source # | Diagonal matrices can always be inverted |