Skip to content

Instantly share code, notes, and snippets.

@kleem
Last active November 8, 2019 07:10
Show Gist options
  • Save kleem/0edab3200092267384f7 to your computer and use it in GitHub Desktop.
Save kleem/0edab3200092267384f7 to your computer and use it in GitHub Desktop.
Collapsible Indented Tree
{"name":"Dipartimenti","children":[{"type":"dipartimento","name":"Dipartimento Ingegneria, ICT e Tecnologie per l'Energia e i Trasporti","sigla":"DIITET","children":[{"type":"istituto","name":"Istituto di Informatica e Telematica","sigla":"IIT"},{"type":"istituto","name":"Istituto di Scienze e Tecnologie Informatiche","sigla":"ISTI"},{"type":"istituto","name":"Istituto Nazionale per Studi ed Esperienze di Architettura Navale","sigla":"INSEAN"},{"type":"istituto","name":"Istituto di Fisica del Plasma \"Piero Caldirola\"","sigla":"IFP"},{"type":"istituto","name":"Istituto Gas Ionizzati","sigla":"IGI"},{"type":"istituto","name":"Istituto di Ricerche sulla Combustione","sigla":"IRC"},{"type":"istituto","name":"Istituto di Tecnologie Avanzate per l'Energia \"Nicola Giordano\"","sigla":"ITAE"},{"type":"istituto","name":"Istituto Motori","sigla":"IM","children":[{"type":"unita_di_ ricerca","name":"motori","site_url":"www.motori.it"}]},{"type":"istituto","name":"Istituto di Fisica Applicata \"Nello Carrara\"","sigla":"IFAC"},{"type":"istituto","name":"Istituto dei Materiali per l'Elettronica ed il Magnetismo","sigla":"IMEM"},{"type":"istituto","name":"Istituto di Studi sui Sistemi Intelligenti per l'Automazione","sigla":"ISSIA"},{"type":"istituto","name":"Istituto per le Macchine Agricole e Movimento Terra","sigla":"IMAMOTER"},{"type":"istituto","name":"Istituto di Tecnologie Industriali e Automazione","sigla":"ITIA"},{"type":"istituto","name":"Istituto per le Tecnologie della Costruzione","sigla":"ITC"},{"type":"istituto","name":"Istituto di Acustica e Sensoristica \"Orso Mario Corbino\"","sigla":"IDASC"},{"type":"istituto","name":"Istituto per il Rilevamento Elettromagnetico dell'Ambiente","sigla":"IREA"},{"type":"istituto","name":"Istituto di Elettronica e di Ingegneria dell'Informazione e delle Telecomunicazioni","sigla":"IEIIT"},{"type":"istituto","name":"Istituto di Calcolo e Reti ad Alte Prestazioni","sigla":"ICAR"},{"type":"istituto","name":"Istituto per le Applicazioni del Calcolo \"Mauro Picone\"","sigla":"IAC"},{"type":"istituto","name":"Istituto di Analisi dei Sistemi ed Informatica \"Antonio Ruberti\"","sigla":"IASI"},{"type":"istituto","name":"Istituto di Matematica Applicata e Tecnologie Informatiche","sigla":"IMATI"}]},{"type":"dipartimento","name":"Dipartimento di Scienze Fisiche e Tecnologie della Materia","sigla":"DSFTM","children":[{"type":"istituto","name":"Istituto Officina dei Materiali","sigla":"IOM"},{"type":"istituto","name":"Istituto Superconduttori, Materiali innovativi e dispositivi","sigla":"SPIN"},{"type":"istituto","name":"Istituto di Nanoscienze","sigla":"NANO"},{"type":"istituto","name":"Istituto Nazionale di Ottica","sigla":"INO"},{"type":"istituto","name":"Istituto di Struttura della Materia","sigla":"ISM"},{"type":"istituto","name":"Istituto dei Sistemi Complessi","sigla":"ISC"},{"type":"istituto","name":"Istituto di Biofisica","sigla":"IBF"},{"type":"istituto","name":"Istituto di Scienze Applicate e Sistemi Intelligenti \"Eduardo Caianiello\"","sigla":"ISASI"},{"type":"istituto","name":"Istituto di Nanotecnologia","sigla":"NANOTEC"},{"type":"istituto","name":"Istituto di Fotonica e Nanotecnologie","sigla":"IFN"},{"type":"istituto","name":"Istituto per la Microelettronica e Microsistemi","sigla":"IMM"}]},{"type":"dipartimento","name":"Dipartimento di Scienze Chimiche e Tecnologie dei Materiali","sigla":"DSCTM","children":[{"type":"istituto","name":"Istituto per la Tecnologia delle Membrane","sigla":"ITM"},{"type":"istituto","name":"Istituto per lo Studio dei Materiali Nanostrutturati","sigla":"ISMN"},{"type":"istituto","name":"Istituto di Metodologie Chimiche","sigla":"IMC"},{"type":"istituto","name":"Istituto per lo Studio delle Macromolecole","sigla":"ISMAC"},{"type":"istituto","name":"Istituto per i Polimeri, Compositi e Biomateriali","sigla":"IPCB"},{"type":"istituto","name":"Istituto di Scienze e Tecnologie Molecolari","sigla":"ISTM"},{"type":"istituto","name":"Istituto per i Processi Chimico-Fisici","sigla":"IPCF"},{"type":"istituto","name":"Istituto di Chimica Biomolecolare","sigla":"ICB"},{"type":"istituto","name":"Istituto di Chimica dei Composti Organo Metallici","sigla":"ICCOm"},{"type":"istituto","name":"Istituto per la Sintesi Organica e la Fotoreattivit\u00e0","sigla":"ISOF"},{"type":"istituto","name":"Istituto di Scienza e Tecnologia dei Materiali Ceramici","sigla":"ISTEC"},{"type":"istituto","name":"Istituto di Chimica del Riconoscimento Molecolare","sigla":"ICRM"},{"type":"istituto","name":"Istituto di Cristallografia","sigla":"IC"},{"type":"istituto","name":"Istituto per l'Energetica e le Interfasi","sigla":"IENI"}]},{"type":"dipartimento","name":"Dipartimento di Scienze del Sistema Terra e Tecnologie per l'Ambiente","sigla":"DTA","children":[{"type":"istituto","name":"Istituto di Ricerca per la Protezione Idrogeologica","sigla":"IRPI"},{"type":"istituto","name":"Istituto di Geologia Ambientale e Geoingegneria","sigla":"IGAG"},{"type":"istituto","name":"Istituto di Scienze Marine","sigla":"ISMAR"},{"type":"istituto","name":"Istituto di Ricerca sulle Acque","sigla":"IRSA"},{"type":"istituto","name":"Istituto sull'Inquinamento Atmosferico","sigla":"IIA"},{"type":"istituto","name":"Istituto di Scienze dell'Atmosfera e del Clima","sigla":"ISAC"},{"type":"istituto","name":"Istituto di Metodologie per l'Analisi Ambientale","sigla":"IMAA"},{"type":"istituto","name":"Istituto per l'Ambiente Marino","sigla":"IAMC"},{"type":"istituto","name":"Istituto per la Dinamica dei Processi Ambientali","sigla":"IDPA"},{"type":"istituto","name":"Istituto di Geoscienze e Georisorse","sigla":"IGG"},{"type":"istituto","name":"Istituto di Biologia Agro-Ambientale e Forestale","sigla":"IBAF"}]},{"type":"dipartimento","name":"Dipartimento di Scienze Bio-Agroalimentari","sigla":"DISBA","children":[{"type":"istituto","name":"Istituto per il sistema produzione animale in ambiente Mediterraneo","sigla":"ISPAAM"},{"type":"istituto","name":"Istituto di Biologia e Biotecnologia Agraria","sigla":"IBBA"},{"type":"istituto","name":"Istituto di Biometeorologia","sigla":"IBIMET"},{"type":"istituto","name":"Istituto per i Sistemi Agricoli e Forestali del Mediterraneo","sigla":"ISAFoM"},{"type":"istituto","name":"Istituto per la Protezione Sostenibile delle Piante","sigla":"IPSP"},{"type":"istituto","name":"Istituto di Bioscienze e Biorisorse","sigla":"IBBR"},{"type":"istituto","name":"Istituto di Scienze delle Produzioni Alimentari","sigla":"ISPA"},{"type":"istituto","name":"Istituto per la Valorizzazione del Legno e delle Specie Arboree","sigla":"IVALSA"}]},{"type":"dipartimento","name":"Dipartimento di Scienze Biomediche","sigla":"DSB","children":[{"type":"istituto","name":"Istituto di Biostrutture e Bioimmagini","sigla":"IBB"},{"type":"istituto","name":"Istituto di Scienze Neurologiche","sigla":"ISN"},{"type":"istituto","name":"Istituto di Farmacologia Traslazionale","sigla":"IFT"},{"type":"istituto","name":"Istituto di Bioimmagini e Fisiologia Molecolare","sigla":"IBFM"},{"type":"istituto","name":"Istituto di Genetica Molecolare","sigla":"IGM"},{"type":"istituto","name":"Istituto di Tecnologie Biomediche","sigla":"ITB"},{"type":"istituto","name":"Istituto di Biomedicina e di Immunologia Molecolare \"Alberto Monroy\"","sigla":"IBIM"},{"type":"istituto","name":"Istituto di Fisiologia Clinica","sigla":"IFC"},{"type":"istituto","name":"Istituto di Neuroscienze","sigla":"IN"},{"type":"istituto","name":"Istituto di Ricerca Genetica e Biomedica","sigla":"IRGB"},{"type":"istituto","name":"Istituto di Biochimica delle Proteine","sigla":"IBP"},{"type":"istituto","name":"Istituto di Genetica e Biofisica \"Adriano Buzzati Traverso\"","sigla":"IGB"},{"type":"istituto","name":"istituto di Biologia Cellulare e Neurobiologia","sigla":"IBCN"},{"type":"istituto","name":"Istituto di Biologia e Patologia Molecolari","sigla":"IBPM"},{"type":"istituto","name":"Istituto per l'Endocrinologia e l'Oncologia \"Gaetano Salvatore\"","sigla":"IEOS"},{"type":"istituto","name":"Istituto di Biomembrane e Bioenergetica","sigla":"IBBE"}]},{"type":"dipartimento","name":"Dipartimento di Scienze Umane e Sociali - Patrimonio Culturale","sigla":"DSU","children":[{"type":"istituto","name":"Istituto di Studi sul Mediterraneo Antico","sigla":"ISMA"},{"type":"istituto","name":"Centro di Responsabilit\u00e0 di Attivit\u00e0 Scientifica","sigla":"IDAIC"},{"type":"istituto","name":"Istituto per i Beni Archeologici e Monumentali","sigla":"IBAM"},{"type":"istituto","name":"Istituto per le Tecnologie Applicate ai Beni Culturali","sigla":"ITABC"},{"type":"istituto","name":"Istituto per la Conservazione e Valorizzazione dei Beni Culturali","sigla":"ICVBC"},{"type":"istituto","name":"Istituto di Scienze e Tecnologie della Cognizione","sigla":"ISTC"},{"type":"istituto","name":"Istituto per le Tecnologie Didattiche","sigla":"ITD"},{"type":"istituto","name":"Istituto di Studi Giuridici Internazionali","sigla":"ISGI"},{"type":"istituto","name":"Istituto di Opera del Vocabolario Italiano","sigla":"OVI"},{"type":"istituto","name":"Istituto di Teoria e Tecniche dell'Informazione Giuridica","sigla":"ITTIG"},{"type":"istituto","name":"Istituto di Linguistica Computazionale \"Antonio Zampolli\"","sigla":"ILC"},{"type":"istituto","name":"Istituto di Studi sulle Societ\u00e0 del Mediterraneo","sigla":"ISSM"},{"type":"istituto","name":"Istituto di Ricerca su Innovazione e Servizi per lo Sviluppo","sigla":"IRISS"},{"type":"istituto","name":"Istituto di Storia dell'Europa Mediterranea","sigla":"ISEM"},{"type":"istituto","name":"Istituto di Studi sui Sistemi Regionali Federali e sulle Autonomie \"Massimo Severo Giannini\"","sigla":"ISSIRFA"},{"type":"istituto","name":"Istituto di Ricerche sulla Popolazione e le Politiche Sociali","sigla":"IRPPS"},{"type":"istituto","name":"Istituto di Ricerca sui Sistemi Giudiziari","sigla":"IRSIG"},{"type":"istituto","name":"Istituto per il Lessico Intellettuale Europeo e Storia delle Idee","sigla":"ILIESI"},{"type":"istituto","name":"Istituto per la Storia del Pensiero Filosofico e Scientifico Moderno","sigla":"ISPF"},{"type":"istituto","name":"Istituto di Ricerca sulla Crescita Economica Sostenibile","sigla":"IRCRES"}]}]}
{
"name": "flare",
"children": [
{
"name": "analytics",
"children": [
{
"name": "cluster",
"children": [
{"name": "AgglomerativeCluster", "size": 3938},
{"name": "CommunityStructure", "size": 3812},
{"name": "HierarchicalCluster", "size": 6714},
{"name": "MergeEdge", "size": 743}
]
},
{
"name": "graph",
"children": [
{"name": "BetweennessCentrality", "size": 3534},
{"name": "LinkDistance", "size": 5731},
{"name": "MaxFlowMinCut", "size": 7840},
{"name": "ShortestPaths", "size": 5914},
{"name": "SpanningTree", "size": 3416}
]
},
{
"name": "optimization",
"children": [
{"name": "AspectRatioBanker", "size": 7074}
]
}
]
},
{
"name": "animate",
"children": [
{"name": "Easing", "size": 17010},
{"name": "FunctionSequence", "size": 5842},
{
"name": "interpolate",
"children": [
{"name": "ArrayInterpolator", "size": 1983},
{"name": "ColorInterpolator", "size": 2047},
{"name": "DateInterpolator", "size": 1375},
{"name": "Interpolator", "size": 8746},
{"name": "MatrixInterpolator", "size": 2202},
{"name": "NumberInterpolator", "size": 1382},
{"name": "ObjectInterpolator", "size": 1629},
{"name": "PointInterpolator", "size": 1675},
{"name": "RectangleInterpolator", "size": 2042}
]
},
{"name": "ISchedulable", "size": 1041},
{"name": "Parallel", "size": 5176},
{"name": "Pause", "size": 449},
{"name": "Scheduler", "size": 5593},
{"name": "Sequence", "size": 5534},
{"name": "Transition", "size": 9201},
{"name": "Transitioner", "size": 19975},
{"name": "TransitionEvent", "size": 1116},
{"name": "Tween", "size": 6006}
]
},
{
"name": "data",
"children": [
{
"name": "converters",
"children": [
{"name": "Converters", "size": 721},
{"name": "DelimitedTextConverter", "size": 4294},
{"name": "GraphMLConverter", "size": 9800},
{"name": "IDataConverter", "size": 1314},
{"name": "JSONConverter", "size": 2220}
]
},
{"name": "DataField", "size": 1759},
{"name": "DataSchema", "size": 2165},
{"name": "DataSet", "size": 586},
{"name": "DataSource", "size": 3331},
{"name": "DataTable", "size": 772},
{"name": "DataUtil", "size": 3322}
]
},
{
"name": "display",
"children": [
{"name": "DirtySprite", "size": 8833},
{"name": "LineSprite", "size": 1732},
{"name": "RectSprite", "size": 3623},
{"name": "TextSprite", "size": 10066}
]
},
{
"name": "flex",
"children": [
{"name": "FlareVis", "size": 4116}
]
},
{
"name": "physics",
"children": [
{"name": "DragForce", "size": 1082},
{"name": "GravityForce", "size": 1336},
{"name": "IForce", "size": 319},
{"name": "NBodyForce", "size": 10498},
{"name": "Particle", "size": 2822},
{"name": "Simulation", "size": 9983},
{"name": "Spring", "size": 2213},
{"name": "SpringForce", "size": 1681}
]
},
{
"name": "query",
"children": [
{"name": "AggregateExpression", "size": 1616},
{"name": "And", "size": 1027},
{"name": "Arithmetic", "size": 3891},
{"name": "Average", "size": 891},
{"name": "BinaryExpression", "size": 2893},
{"name": "Comparison", "size": 5103},
{"name": "CompositeExpression", "size": 3677},
{"name": "Count", "size": 781},
{"name": "DateUtil", "size": 4141},
{"name": "Distinct", "size": 933},
{"name": "Expression", "size": 5130},
{"name": "ExpressionIterator", "size": 3617},
{"name": "Fn", "size": 3240},
{"name": "If", "size": 2732},
{"name": "IsA", "size": 2039},
{"name": "Literal", "size": 1214},
{"name": "Match", "size": 3748},
{"name": "Maximum", "size": 843},
{
"name": "methods",
"children": [
{"name": "add", "size": 593},
{"name": "and", "size": 330},
{"name": "average", "size": 287},
{"name": "count", "size": 277},
{"name": "distinct", "size": 292},
{"name": "div", "size": 595},
{"name": "eq", "size": 594},
{"name": "fn", "size": 460},
{"name": "gt", "size": 603},
{"name": "gte", "size": 625},
{"name": "iff", "size": 748},
{"name": "isa", "size": 461},
{"name": "lt", "size": 597},
{"name": "lte", "size": 619},
{"name": "max", "size": 283},
{"name": "min", "size": 283},
{"name": "mod", "size": 591},
{"name": "mul", "size": 603},
{"name": "neq", "size": 599},
{"name": "not", "size": 386},
{"name": "or", "size": 323},
{"name": "orderby", "size": 307},
{"name": "range", "size": 772},
{"name": "select", "size": 296},
{"name": "stddev", "size": 363},
{"name": "sub", "size": 600},
{"name": "sum", "size": 280},
{"name": "update", "size": 307},
{"name": "variance", "size": 335},
{"name": "where", "size": 299},
{"name": "xor", "size": 354},
{"name": "_", "size": 264}
]
},
{"name": "Minimum", "size": 843},
{"name": "Not", "size": 1554},
{"name": "Or", "size": 970},
{"name": "Query", "size": 13896},
{"name": "Range", "size": 1594},
{"name": "StringUtil", "size": 4130},
{"name": "Sum", "size": 791},
{"name": "Variable", "size": 1124},
{"name": "Variance", "size": 1876},
{"name": "Xor", "size": 1101}
]
},
{
"name": "scale",
"children": [
{"name": "IScaleMap", "size": 2105},
{"name": "LinearScale", "size": 1316},
{"name": "LogScale", "size": 3151},
{"name": "OrdinalScale", "size": 3770},
{"name": "QuantileScale", "size": 2435},
{"name": "QuantitativeScale", "size": 4839},
{"name": "RootScale", "size": 1756},
{"name": "Scale", "size": 4268},
{"name": "ScaleType", "size": 1821},
{"name": "TimeScale", "size": 5833}
]
},
{
"name": "util",
"children": [
{"name": "Arrays", "size": 8258},
{"name": "Colors", "size": 10001},
{"name": "Dates", "size": 8217},
{"name": "Displays", "size": 12555},
{"name": "Filter", "size": 2324},
{"name": "Geometry", "size": 10993},
{
"name": "heap",
"children": [
{"name": "FibonacciHeap", "size": 9354},
{"name": "HeapNode", "size": 1233}
]
},
{"name": "IEvaluable", "size": 335},
{"name": "IPredicate", "size": 383},
{"name": "IValueProxy", "size": 874},
{
"name": "math",
"children": [
{"name": "DenseMatrix", "size": 3165},
{"name": "IMatrix", "size": 2815},
{"name": "SparseMatrix", "size": 3366}
]
},
{"name": "Maths", "size": 17705},
{"name": "Orientation", "size": 1486},
{
"name": "palette",
"children": [
{"name": "ColorPalette", "size": 6367},
{"name": "Palette", "size": 1229},
{"name": "ShapePalette", "size": 2059},
{"name": "SizePalette", "size": 2291}
]
},
{"name": "Property", "size": 5559},
{"name": "Shapes", "size": 19118},
{"name": "Sort", "size": 6887},
{"name": "Stats", "size": 6557},
{"name": "Strings", "size": 22026}
]
},
{
"name": "vis",
"children": [
{
"name": "axis",
"children": [
{"name": "Axes", "size": 1302},
{"name": "Axis", "size": 24593},
{"name": "AxisGridLine", "size": 652},
{"name": "AxisLabel", "size": 636},
{"name": "CartesianAxes", "size": 6703}
]
},
{
"name": "controls",
"children": [
{"name": "AnchorControl", "size": 2138},
{"name": "ClickControl", "size": 3824},
{"name": "Control", "size": 1353},
{"name": "ControlList", "size": 4665},
{"name": "DragControl", "size": 2649},
{"name": "ExpandControl", "size": 2832},
{"name": "HoverControl", "size": 4896},
{"name": "IControl", "size": 763},
{"name": "PanZoomControl", "size": 5222},
{"name": "SelectionControl", "size": 7862},
{"name": "TooltipControl", "size": 8435}
]
},
{
"name": "data",
"children": [
{"name": "Data", "size": 20544},
{"name": "DataList", "size": 19788},
{"name": "DataSprite", "size": 10349},
{"name": "EdgeSprite", "size": 3301},
{"name": "NodeSprite", "size": 19382},
{
"name": "render",
"children": [
{"name": "ArrowType", "size": 698},
{"name": "EdgeRenderer", "size": 5569},
{"name": "IRenderer", "size": 353},
{"name": "ShapeRenderer", "size": 2247}
]
},
{"name": "ScaleBinding", "size": 11275},
{"name": "Tree", "size": 7147},
{"name": "TreeBuilder", "size": 9930}
]
},
{
"name": "events",
"children": [
{"name": "DataEvent", "size": 2313},
{"name": "SelectionEvent", "size": 1880},
{"name": "TooltipEvent", "size": 1701},
{"name": "VisualizationEvent", "size": 1117}
]
},
{
"name": "legend",
"children": [
{"name": "Legend", "size": 20859},
{"name": "LegendItem", "size": 4614},
{"name": "LegendRange", "size": 10530}
]
},
{
"name": "operator",
"children": [
{
"name": "distortion",
"children": [
{"name": "BifocalDistortion", "size": 4461},
{"name": "Distortion", "size": 6314},
{"name": "FisheyeDistortion", "size": 3444}
]
},
{
"name": "encoder",
"children": [
{"name": "ColorEncoder", "size": 3179},
{"name": "Encoder", "size": 4060},
{"name": "PropertyEncoder", "size": 4138},
{"name": "ShapeEncoder", "size": 1690},
{"name": "SizeEncoder", "size": 1830}
]
},
{
"name": "filter",
"children": [
{"name": "FisheyeTreeFilter", "size": 5219},
{"name": "GraphDistanceFilter", "size": 3165},
{"name": "VisibilityFilter", "size": 3509}
]
},
{"name": "IOperator", "size": 1286},
{
"name": "label",
"children": [
{"name": "Labeler", "size": 9956},
{"name": "RadialLabeler", "size": 3899},
{"name": "StackedAreaLabeler", "size": 3202}
]
},
{
"name": "layout",
"children": [
{"name": "AxisLayout", "size": 6725},
{"name": "BundledEdgeRouter", "size": 3727},
{"name": "CircleLayout", "size": 9317},
{"name": "CirclePackingLayout", "size": 12003},
{"name": "DendrogramLayout", "size": 4853},
{"name": "ForceDirectedLayout", "size": 8411},
{"name": "IcicleTreeLayout", "size": 4864},
{"name": "IndentedTreeLayout", "size": 3174},
{"name": "Layout", "size": 7881},
{"name": "NodeLinkTreeLayout", "size": 12870},
{"name": "PieLayout", "size": 2728},
{"name": "RadialTreeLayout", "size": 12348},
{"name": "RandomLayout", "size": 870},
{"name": "StackedAreaLayout", "size": 9121},
{"name": "TreeMapLayout", "size": 9191}
]
},
{"name": "Operator", "size": 2490},
{"name": "OperatorList", "size": 5248},
{"name": "OperatorSequence", "size": 4190},
{"name": "OperatorSwitch", "size": 2581},
{"name": "SortOperator", "size": 2023}
]
},
{"name": "Visualization", "size": 16540}
]
}
]
}
svg = d3.select 'svg'
tree_layout = d3.layout.tree()
toggle = (n, recursive) ->
if n.children?
n._children = n.children
delete n.children
if recursive
n._children.forEach (c) -> toggle(c, true)
else if n._children?
n.children = n._children
delete n._children
if recursive
n.children.forEach (c) -> toggle(c, true)
d3.json 'dipartimenti.json', (tree) ->
# collapse all
tree.children.forEach (c) -> toggle(c, true)
render(tree)
DX = 25
DY = 30
render = (tree) ->
# preprocessing
nodes_data = tree_layout.nodes tree
# layout
nodes_data.forEach (d,i) ->
d.x = d.depth*DX+16
d.y = i*DY+20
SPEED = 400
# make room for the whole tree
svg
.transition().delay(SPEED).duration(SPEED)
.attr
height: nodes_data.length*DY+20
# nodes
nodes = svg.selectAll '.node'
.data nodes_data, (d) -> "#{d.depth}_#{d.name}"
nodes.exit()
.transition().duration(SPEED)
.attr
opacity: 0
.remove()
nodes
.transition().delay(SPEED).duration(SPEED)
.attr
transform: (d) -> "translate(#{d.x}, #{d.y})"
nodes.enter().append 'text'
.text (d) -> d.name
.attr
class: 'node'
dy: '0.35em'
transform: (d) -> "translate(#{d.x}, #{d.y})"
opacity: 0
.on 'click', (d) ->
toggle(d, false)
render(tree)
.classed 'internal', (d) -> d.children? or d._children?
.transition().delay(SPEED*2).duration(SPEED)
.attr
opacity: 1
nodes
.classed 'collapsed', (d) -> d._children?
# links
links = svg.selectAll '.link'
.data nodes_data.filter((d) -> d.parent?), (d) -> "#{d.depth}_#{d.name}"
links.exit()
.transition().duration(SPEED)
.attr
opacity: 0
.remove()
links
.transition().delay(SPEED).duration(SPEED)
.attr
d: (d) -> "M#{d.x-4} #{d.y} L#{d.parent.x+8} #{d.y} L#{d.parent.x+8} #{d.parent.y+10}"
links.enter().append 'path'
.attr
class: 'link'
opacity: 0
.transition().delay(SPEED*2).duration(SPEED)
.attr
d: (d) -> "M#{d.x-4} #{d.y} L#{d.parent.x+8} #{d.y} L#{d.parent.x+8} #{d.parent.y+10}"
opacity: 1
html, body {
padding: 0;
margin: 0;
width: 100%;
height: 100%;
}
svg {
width: 100%;
}
.node {
font-size: 14px;
font-family: sans-serif;
user-select: none;
-webkit-user-select: none;
cursor: default;
}
.link {
fill: none;
stroke: #DDD;
shape-rendering: crispEdges;
}
.internal.node {
font-weight: bold;
cursor: pointer;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Indented tree</title>
<link type="text/css" href="index.css" rel="stylesheet"/>
<script src="http://d3js.org/d3.v3.min.js"></script>
</head>
<body>
<svg></svg>
<script src="index.js"></script>
</body>
</html>
// Generated by CoffeeScript 1.10.0
(function() {
var DX, DY, render, svg, toggle, tree_layout;
svg = d3.select('svg');
tree_layout = d3.layout.tree();
toggle = function(n, recursive) {
if (n.children != null) {
n._children = n.children;
delete n.children;
if (recursive) {
return n._children.forEach(function(c) {
return toggle(c, true);
});
}
} else if (n._children != null) {
n.children = n._children;
delete n._children;
if (recursive) {
return n.children.forEach(function(c) {
return toggle(c, true);
});
}
}
};
d3.json('dipartimenti.json', function(tree) {
tree.children.forEach(function(c) {
return toggle(c, true);
});
return render(tree);
});
DX = 25;
DY = 30;
render = function(tree) {
var SPEED, links, nodes, nodes_data;
nodes_data = tree_layout.nodes(tree);
nodes_data.forEach(function(d, i) {
d.x = d.depth * DX + 16;
return d.y = i * DY + 20;
});
SPEED = 400;
svg.transition().delay(SPEED).duration(SPEED).attr({
height: nodes_data.length * DY + 20
});
nodes = svg.selectAll('.node').data(nodes_data, function(d) {
return d.depth + "_" + d.name;
});
nodes.exit().transition().duration(SPEED).attr({
opacity: 0
}).remove();
nodes.transition().delay(SPEED).duration(SPEED).attr({
transform: function(d) {
return "translate(" + d.x + ", " + d.y + ")";
}
});
nodes.enter().append('text').text(function(d) {
return d.name;
}).attr({
"class": 'node',
dy: '0.35em',
transform: function(d) {
return "translate(" + d.x + ", " + d.y + ")";
},
opacity: 0
}).on('click', function(d) {
toggle(d, false);
return render(tree);
}).classed('internal', function(d) {
return (d.children != null) || (d._children != null);
}).transition().delay(SPEED * 2).duration(SPEED).attr({
opacity: 1
});
nodes.classed('collapsed', function(d) {
return d._children != null;
});
links = svg.selectAll('.link').data(nodes_data.filter(function(d) {
return d.parent != null;
}), function(d) {
return d.depth + "_" + d.name;
});
links.exit().transition().duration(SPEED).attr({
opacity: 0
}).remove();
links.transition().delay(SPEED).duration(SPEED).attr({
d: function(d) {
return "M" + (d.x - 4) + " " + d.y + " L" + (d.parent.x + 8) + " " + d.y + " L" + (d.parent.x + 8) + " " + (d.parent.y + 10);
}
});
return links.enter().append('path').attr({
"class": 'link',
opacity: 0
}).transition().delay(SPEED * 2).duration(SPEED).attr({
d: function(d) {
return "M" + (d.x - 4) + " " + d.y + " L" + (d.parent.x + 8) + " " + d.y + " L" + (d.parent.x + 8) + " " + (d.parent.y + 10);
},
opacity: 1
});
};
}).call(this);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment