Commit 0d381e14 authored by Przemyslaw Kaminski's avatar Przemyslaw Kaminski Committed by Alexandre Delanoë

[graph] fix node size transformation

parent 037ea73b
......@@ -25,6 +25,7 @@ import Gargantext.Components.GraphExplorer.Toolbar.Controls as Controls
import Gargantext.Components.GraphExplorer.TopBar as GETB
import Gargantext.Components.GraphExplorer.Types (GraphSideDoc)
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.GraphExplorer.Utils as GEU
import Gargantext.Config (defaultFrontends)
import Gargantext.Data.Louvain as Louvain
import Gargantext.Hooks.Session (useSession)
......@@ -289,7 +290,7 @@ graphViewCpt = R.memo' $ here.component "graphView" cpt where
convert :: GET.GraphData -> Tuple (Maybe GET.MetaData) SigmaxT.SGraph
convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges}
where
nodes = foldMapWithIndex nodeFn r.nodes
nodes = foldMapWithIndex nodeFn $ GEU.normalizeNodeSize 1 10000 r.nodes
nodeFn _i nn@(GEGT.Node n) =
Seq.singleton {
borderColor: color
......@@ -302,6 +303,7 @@ convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges}
, id : n.id_
, label : n.label
, size : DN.log (toNumber n.size + 1.0)
--, size: toNumber n.size
, type : modeGraphType gargType
, x : n.x -- cos (toNumber i)
, y : n.y -- sin (toNumber i)
......
......@@ -9,11 +9,12 @@ import Gargantext.Prelude
import Data.Array as A
import Data.Foldable (maximum, minimum)
import Data.Lens (Lens', lens, over, traversed)
import Data.Lens (Lens', lens, over, traversed, (^.))
import Data.Int (floor, toNumber)
import Data.Maybe (Maybe(..))
import Data.Maybe (Maybe(..), fromMaybe, maybe)
import Data.Newtype (wrap)
import Data.Sequence as Seq
import Data.Traversable (class Traversable)
import Gargantext.Components.GraphExplorer.GraphTypes as GEGT
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Hooks.Sigmax.Types as ST
......@@ -40,7 +41,7 @@ stNodeToGET { id, label, x, y, _original: GEGT.Node { attributes, size, type_ }
-- | Normalize nodes, i.e. set their {x, y} values so that they are in
-- | range [0, 1].
normalizeNodes :: Seq.Seq GEGT.Node -> Seq.Seq GEGT.Node
normalizeNodes :: forall t. Traversable t => t GEGT.Node -> t GEGT.Node
normalizeNodes ns = GUL.normalizeLens xLens $ GUL.normalizeLens yLens ns
where
xLens :: Lens' GEGT.Node Number
......@@ -48,11 +49,20 @@ normalizeNodes ns = GUL.normalizeLens xLens $ GUL.normalizeLens yLens ns
yLens :: Lens' GEGT.Node Number
yLens = lens (\(GEGT.Node { y }) -> y) $ (\(GEGT.Node n) val -> GEGT.Node (n { y = val }))
normalizeNodeSize :: Int -> Int -> Seq.Seq GEGT.Node -> Seq.Seq GEGT.Node
normalizeNodeSize minSize maxSize ns = over traversed (over sizeLens (\s -> toNumber minSize + s * quotient)) $ GUL.normalizeLens sizeLens ns
normalizeNodeSize :: forall t. Traversable t => Int -> Int -> t GEGT.Node -> t GEGT.Node
normalizeNodeSize minSize maxSize ns = over traversed (over sizeLens (\s -> toNumber minSize + (s - sizeMin') * quotient)) ns
where
sizes = over traversed (_ ^. sizeLens) ns
sizeMin = minimum sizes
sizeMax = maximum sizes
range = do
sMin <- sizeMin
sMax <- sizeMax
pure $ sMax - sMin
sizeMin' = fromMaybe 0.0 sizeMin
divisor = maybe 1.0 (\r -> 1.0 / r) range
quotient :: Number
quotient = toNumber $ maxSize - minSize
quotient = (toNumber $ maxSize - minSize) * divisor
sizeLens :: Lens' GEGT.Node Number
sizeLens = lens (\(GEGT.Node { size }) -> toNumber size) $ (\(GEGT.Node n) val -> GEGT.Node (n { size = floor val }))
......
......@@ -13,6 +13,7 @@ import Data.Tuple.Nested ((/\))
import Gargantext.Components.App.Store as AppStore
import Gargantext.Components.Bootstrap as B
import Gargantext.Components.GraphExplorer.API as GraphAPI
import Gargantext.Components.GraphExplorer.GraphTypes as GEGT
import Gargantext.Components.GraphExplorer.Layout (convert, layout)
import Gargantext.Components.GraphExplorer.Store as GraphStore
import Gargantext.Components.GraphExplorer.Types as GET
......@@ -116,7 +117,7 @@ type HydrateStoreProps =
, cacheParams :: GET.CacheParams
)
hydrateStore:: R2.Leaf HydrateStoreProps
hydrateStore :: R2.Leaf HydrateStoreProps
hydrateStore = R2.leaf hydrateStoreCpt
hydrateStoreCpt :: R.Component HydrateStoreProps
hydrateStoreCpt = here.component "hydrateStore" cpt where
......@@ -126,6 +127,11 @@ hydrateStoreCpt = here.component "hydrateStore" cpt where
, hyperdataGraph
, cacheParams
} _ = do
R.useEffect' $ do
let (GET.HyperdataGraph { graph: hg }) = hyperdataGraph
let GET.GraphData g = hg
here.log2 "[hydrateStore] sizes" $ (\(GEGT.Node { id_, size }) -> "id: " <> id_ <> ", size: " <> show size) <$> g.nodes
-- | Computed
-- |
let
......
......@@ -3,7 +3,7 @@ module Gargantext.Utils.Lens where
import Gargantext.Prelude
import Data.Foldable (maximum, minimum)
import Data.Maybe (Maybe(..))
import Data.Maybe (Maybe(..), fromMaybe, maybe)
import Data.Lens
import Data.Traversable
......@@ -20,7 +20,6 @@ normalizeLens l ns = over traversed normalize' ns
minv <- vMin
maxv <- vMax
pure $ maxv - minv
divisor = case vRange of
Nothing -> 1.0
Just d -> 1.0 / d
normalize' n = over l (_ * divisor) n
divisor = maybe 1.0 (\r -> 1.0 / r) vRange
min = fromMaybe 0.0 vMin
normalize' n = over l (\v -> (v - min) * divisor) n
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment