Hi, every one! Welcome back. In this post, I am going to show you the real time demo of the Angular nvd3 Force Directed Graph.There might be many graph libraries for Angular charts on the internet but nvd3 provides rich user interaction events and good looking UI. It simply looks beautiful. Force graph is used to display the network of things. For example diagrammatic representation of your Facebook connection. Given below, is the simple live demo of Force Directed Graph with some sample data.

Click here for a live demo of Force Direction Graph.

  1. Create ASP.NET MVC Web Application (I created in Visual Studio 2013).
  2. Create a Controller (HomeController).
  3. Create an Index action and add View to this action.
  4. Replace the Index view code with the code, as shown below:

    Index.cshtml
    1. @{
    2. ViewBag.Title = "mitechdev.com";
    3. }
    4. <h2>Angular nvd3-Force Direction Graph</h2>
    5. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.3/nv.d3.min.css" />
    6. <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.9/angular.min.js"></script>
    7. <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js" charset="utf-8"></script>
    8. <script src="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.3/nv.d3.min.js"></script>
    9. <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-nvd3/1.0.7/angular-nvd3.min.js"></script>
    10. <script src="~/Scripts/myscript.js"></script>
    11. <div ng-app="myapp" ng-controller="GraphController">
    12. <nvd3 options="options" data="data" class="with-3d-shadow with-transitions"></nvd3>
    13. </div>
  5. Add the script code, given below, for Graph display...
  6. The script, given below, is to display the graph. Here, we must add nvd3 directive as dependency in an Angular module.
  7. We can customize this graph, using $scope.options and I have prepared the data source, using $scope.data. .

    myscript.js
    1. var app = angular.module('myapp', ['nvd3']);
    2. app.controller('GraphController', function ($scope) {
    3. var color = d3.scale.category20()
    4. $scope.options = {
    5. chart: {
    6. type: 'forceDirectedGraph',
    7. height: 500,
    8. // width: (function () { return nv.utils.windowSize().width })(),
    9. width:700,
    10. margin: { top: 20, right: 20, bottom: 20, left: 20 },
    11. color: function (d) {
    12. return color(d.group)
    13. },
    14. nodeExtras: function (node) {
    15. node && node
    16. .append("text")
    17. .attr("dx", 8)
    18. .attr("dy", ".35em")
    19. .text(function (d) { return d.name })
    20. .style('font-size', '10px');
    21. }
    22. }
    23. };
    24. $scope.data = {
    25. "nodes": [
    26. { "name": "Myriel", "group": 1 },
    27. { "name": "Napoleon", "group": 1 },
    28. { "name": "Mlle.Baptistine", "group": 1 },
    29. { "name": "Mme.Magloire", "group": 1 },
    30. { "name": "CountessdeLo", "group": 1 },
    31. { "name": "Geborand", "group": 1 },
    32. { "name": "Champtercier", "group": 1 },
    33. { "name": "Cravatte", "group": 1 },
    34. { "name": "Count", "group": 1 },
    35. { "name": "OldMan", "group": 1 },
    36. { "name": "Labarre", "group": 2 },
    37. { "name": "Valjean", "group": 2 },
    38. { "name": "Marguerite", "group": 3 },
    39. { "name": "Mme.deR", "group": 2 },
    40. { "name": "Isabeau", "group": 2 },
    41. { "name": "Gervais", "group": 2 },
    42. { "name": "Tholomyes", "group": 3 },
    43. { "name": "Listolier", "group": 3 },
    44. { "name": "Fameuil", "group": 3 },
    45. { "name": "Blacheville", "group": 3 },
    46. { "name": "Favourite", "group": 3 },
    47. { "name": "Dahlia", "group": 3 },
    48. { "name": "Zephine", "group": 3 },
    49. { "name": "Fantine", "group": 3 },
    50. { "name": "Mme.Thenardier", "group": 4 },
    51. { "name": "Thenardier", "group": 4 },
    52. { "name": "Cosette", "group": 5 },
    53. { "name": "Javert", "group": 4 },
    54. { "name": "Fauchelevent", "group": 0 },
    55. { "name": "Bamatabois", "group": 2 },
    56. { "name": "Perpetue", "group": 3 },
    57. { "name": "Simplice", "group": 2 },
    58. { "name": "Scaufflaire", "group": 2 },
    59. { "name": "Woman1", "group": 2 },
    60. { "name": "Judge", "group": 2 },
    61. { "name": "Champmathieu", "group": 2 },
    62. { "name": "Brevet", "group": 2 },
    63. { "name": "Chenildieu", "group": 2 },
    64. { "name": "Cochepaille", "group": 2 },
    65. { "name": "Pontmercy", "group": 4 },
    66. { "name": "Boulatruelle", "group": 6 },
    67. { "name": "Eponine", "group": 4 },
    68. { "name": "Anzelma", "group": 4 },
    69. { "name": "Woman2", "group": 5 },
    70. { "name": "MotherInnocent", "group": 0 },
    71. { "name": "Gribier", "group": 0 },
    72. { "name": "Jondrette", "group": 7 },
    73. { "name": "Mme.Burgon", "group": 7 },
    74. { "name": "Gavroche", "group": 8 },
    75. { "name": "Gillenormand", "group": 5 },
    76. { "name": "Magnon", "group": 5 },
    77. { "name": "Mlle.Gillenormand", "group": 5 },
    78. { "name": "Mme.Pontmercy", "group": 5 },
    79. { "name": "Mlle.Vaubois", "group": 5 },
    80. { "name": "Lt.Gillenormand", "group": 5 },
    81. { "name": "Marius", "group": 8 },
    82. { "name": "BaronessT", "group": 5 },
    83. { "name": "Mabeuf", "group": 8 },
    84. { "name": "Enjolras", "group": 8 },
    85. { "name": "Combeferre", "group": 8 },
    86. { "name": "Prouvaire", "group": 8 },
    87. { "name": "Feuilly", "group": 8 },
    88. { "name": "Courfeyrac", "group": 8 },
    89. { "name": "Bahorel", "group": 8 },
    90. { "name": "Bossuet", "group": 8 },
    91. { "name": "Joly", "group": 8 },
    92. { "name": "Grantaire", "group": 8 },
    93. { "name": "MotherPlutarch", "group": 9 },
    94. { "name": "Gueulemer", "group": 4 },
    95. { "name": "Babet", "group": 4 },
    96. { "name": "Claquesous", "group": 4 },
    97. { "name": "Montparnasse", "group": 4 },
    98. { "name": "Toussaint", "group": 5 },
    99. { "name": "Child1", "group": 10 },
    100. { "name": "Child2", "group": 10 },
    101. { "name": "Brujon", "group": 4 },
    102. { "name": "Mme.Hucheloup", "group": 8 }
    103. ],
    104. "links": [
    105. { "source": 1, "target": 0, "value": 1 },
    106. { "source": 2, "target": 0, "value": 8 },
    107. { "source": 3, "target": 0, "value": 10 },
    108. { "source": 3, "target": 2, "value": 6 },
    109. { "source": 4, "target": 0, "value": 1 },
    110. { "source": 5, "target": 0, "value": 1 },
    111. { "source": 6, "target": 0, "value": 1 },
    112. { "source": 7, "target": 0, "value": 1 },
    113. { "source": 8, "target": 0, "value": 2 },
    114. { "source": 9, "target": 0, "value": 1 },
    115. { "source": 11, "target": 10, "value": 1 },
    116. { "source": 11, "target": 3, "value": 3 },
    117. { "source": 11, "target": 2, "value": 3 },
    118. { "source": 11, "target": 0, "value": 5 },
    119. { "source": 12, "target": 11, "value": 1 },
    120. { "source": 13, "target": 11, "value": 1 },
    121. { "source": 14, "target": 11, "value": 1 },
    122. { "source": 15, "target": 11, "value": 1 },
    123. { "source": 17, "target": 16, "value": 4 },
    124. { "source": 18, "target": 16, "value": 4 },
    125. { "source": 18, "target": 17, "value": 4 },
    126. { "source": 19, "target": 16, "value": 4 },
    127. { "source": 19, "target": 17, "value": 4 },
    128. { "source": 19, "target": 18, "value": 4 },
    129. { "source": 20, "target": 16, "value": 3 },
    130. { "source": 20, "target": 17, "value": 3 },
    131. { "source": 20, "target": 18, "value": 3 },
    132. { "source": 20, "target": 19, "value": 4 },
    133. { "source": 21, "target": 16, "value": 3 },
    134. { "source": 21, "target": 17, "value": 3 },
    135. { "source": 21, "target": 18, "value": 3 },
    136. { "source": 21, "target": 19, "value": 3 },
    137. { "source": 21, "target": 20, "value": 5 },
    138. { "source": 22, "target": 16, "value": 3 },
    139. { "source": 22, "target": 17, "value": 3 },
    140. { "source": 22, "target": 18, "value": 3 },
    141. { "source": 22, "target": 19, "value": 3 },
    142. { "source": 22, "target": 20, "value": 4 },
    143. { "source": 22, "target": 21, "value": 4 },
    144. { "source": 23, "target": 16, "value": 3 },
    145. { "source": 23, "target": 17, "value": 3 },
    146. { "source": 23, "target": 18, "value": 3 },
    147. { "source": 23, "target": 19, "value": 3 },
    148. { "source": 23, "target": 20, "value": 4 },
    149. { "source": 23, "target": 21, "value": 4 },
    150. { "source": 23, "target": 22, "value": 4 },
    151. { "source": 23, "target": 12, "value": 2 },
    152. { "source": 23, "target": 11, "value": 9 },
    153. { "source": 24, "target": 23, "value": 2 },
    154. { "source": 24, "target": 11, "value": 7 },
    155. { "source": 25, "target": 24, "value": 13 },
    156. { "source": 25, "target": 23, "value": 1 },
    157. { "source": 25, "target": 11, "value": 12 },
    158. { "source": 26, "target": 24, "value": 4 },
    159. { "source": 26, "target": 11, "value": 31 },
    160. { "source": 26, "target": 16, "value": 1 },
    161. { "source": 26, "target": 25, "value": 1 },
    162. { "source": 27, "target": 11, "value": 17 },
    163. { "source": 27, "target": 23, "value": 5 },
    164. { "source": 27, "target": 25, "value": 5 },
    165. { "source": 27, "target": 24, "value": 1 },
    166. { "source": 27, "target": 26, "value": 1 },
    167. { "source": 28, "target": 11, "value": 8 },
    168. { "source": 28, "target": 27, "value": 1 },
    169. { "source": 29, "target": 23, "value": 1 },
    170. { "source": 29, "target": 27, "value": 1 },
    171. { "source": 29, "target": 11, "value": 2 },
    172. { "source": 30, "target": 23, "value": 1 },
    173. { "source": 31, "target": 30, "value": 2 },
    174. { "source": 31, "target": 11, "value": 3 },
    175. { "source": 31, "target": 23, "value": 2 },
    176. { "source": 31, "target": 27, "value": 1 },
    177. { "source": 32, "target": 11, "value": 1 },
    178. { "source": 33, "target": 11, "value": 2 },
    179. { "source": 33, "target": 27, "value": 1 },
    180. { "source": 34, "target": 11, "value": 3 },
    181. { "source": 34, "target": 29, "value": 2 },
    182. { "source": 35, "target": 11, "value": 3 },
    183. { "source": 35, "target": 34, "value": 3 },
    184. { "source": 35, "target": 29, "value": 2 },
    185. { "source": 36, "target": 34, "value": 2 },
    186. { "source": 36, "target": 35, "value": 2 },
    187. { "source": 36, "target": 11, "value": 2 },
    188. { "source": 36, "target": 29, "value": 1 },
    189. { "source": 37, "target": 34, "value": 2 },
    190. { "source": 37, "target": 35, "value": 2 },
    191. { "source": 37, "target": 36, "value": 2 },
    192. { "source": 37, "target": 11, "value": 2 },
    193. { "source": 37, "target": 29, "value": 1 },
    194. { "source": 38, "target": 34, "value": 2 },
    195. { "source": 38, "target": 35, "value": 2 },
    196. { "source": 38, "target": 36, "value": 2 },
    197. { "source": 38, "target": 37, "value": 2 },
    198. { "source": 38, "target": 11, "value": 2 },
    199. { "source": 38, "target": 29, "value": 1 },
    200. { "source": 39, "target": 25, "value": 1 },
    201. { "source": 40, "target": 25, "value": 1 },
    202. { "source": 41, "target": 24, "value": 2 },
    203. { "source": 41, "target": 25, "value": 3 },
    204. { "source": 42, "target": 41, "value": 2 },
    205. { "source": 42, "target": 25, "value": 2 },
    206. { "source": 42, "target": 24, "value": 1 },
    207. { "source": 43, "target": 11, "value": 3 },
    208. { "source": 43, "target": 26, "value": 1 },
    209. { "source": 43, "target": 27, "value": 1 },
    210. { "source": 44, "target": 28, "value": 3 },
    211. { "source": 44, "target": 11, "value": 1 },
    212. { "source": 45, "target": 28, "value": 2 },
    213. { "source": 47, "target": 46, "value": 1 },
    214. { "source": 48, "target": 47, "value": 2 },
    215. { "source": 48, "target": 25, "value": 1 },
    216. { "source": 48, "target": 27, "value": 1 },
    217. { "source": 48, "target": 11, "value": 1 },
    218. { "source": 49, "target": 26, "value": 3 },
    219. { "source": 49, "target": 11, "value": 2 },
    220. { "source": 50, "target": 49, "value": 1 },
    221. { "source": 50, "target": 24, "value": 1 },
    222. { "source": 51, "target": 49, "value": 9 },
    223. { "source": 51, "target": 26, "value": 2 },
    224. { "source": 51, "target": 11, "value": 2 },
    225. { "source": 52, "target": 51, "value": 1 },
    226. { "source": 52, "target": 39, "value": 1 },
    227. { "source": 53, "target": 51, "value": 1 },
    228. { "source": 54, "target": 51, "value": 2 },
    229. { "source": 54, "target": 49, "value": 1 },
    230. { "source": 54, "target": 26, "value": 1 },
    231. { "source": 55, "target": 51, "value": 6 },
    232. { "source": 55, "target": 49, "value": 12 },
    233. { "source": 55, "target": 39, "value": 1 },
    234. { "source": 55, "target": 54, "value": 1 },
    235. { "source": 55, "target": 26, "value": 21 },
    236. { "source": 55, "target": 11, "value": 19 },
    237. { "source": 55, "target": 16, "value": 1 },
    238. { "source": 55, "target": 25, "value": 2 },
    239. { "source": 55, "target": 41, "value": 5 },
    240. { "source": 55, "target": 48, "value": 4 },
    241. { "source": 56, "target": 49, "value": 1 },
    242. { "source": 56, "target": 55, "value": 1 },
    243. { "source": 57, "target": 55, "value": 1 },
    244. { "source": 57, "target": 41, "value": 1 },
    245. { "source": 57, "target": 48, "value": 1 },
    246. { "source": 58, "target": 55, "value": 7 },
    247. { "source": 58, "target": 48, "value": 7 },
    248. { "source": 58, "target": 27, "value": 6 },
    249. { "source": 58, "target": 57, "value": 1 },
    250. { "source": 58, "target": 11, "value": 4 },
    251. { "source": 59, "target": 58, "value": 15 },
    252. { "source": 59, "target": 55, "value": 5 },
    253. { "source": 59, "target": 48, "value": 6 },
    254. { "source": 59, "target": 57, "value": 2 },
    255. { "source": 60, "target": 48, "value": 1 },
    256. { "source": 60, "target": 58, "value": 4 },
    257. { "source": 60, "target": 59, "value": 2 },
    258. { "source": 61, "target": 48, "value": 2 },
    259. { "source": 61, "target": 58, "value": 6 },
    260. { "source": 61, "target": 60, "value": 2 },
    261. { "source": 61, "target": 59, "value": 5 },
    262. { "source": 61, "target": 57, "value": 1 },
    263. { "source": 61, "target": 55, "value": 1 },
    264. { "source": 62, "target": 55, "value": 9 },
    265. { "source": 62, "target": 58, "value": 17 },
    266. { "source": 62, "target": 59, "value": 13 },
    267. { "source": 62, "target": 48, "value": 7 },
    268. { "source": 62, "target": 57, "value": 2 },
    269. { "source": 62, "target": 41, "value": 1 },
    270. { "source": 62, "target": 61, "value": 6 },
    271. { "source": 62, "target": 60, "value": 3 },
    272. { "source": 63, "target": 59, "value": 5 },
    273. { "source": 63, "target": 48, "value": 5 },
    274. { "source": 63, "target": 62, "value": 6 },
    275. { "source": 63, "target": 57, "value": 2 },
    276. { "source": 63, "target": 58, "value": 4 },
    277. { "source": 63, "target": 61, "value": 3 },
    278. { "source": 63, "target": 60, "value": 2 },
    279. { "source": 63, "target": 55, "value": 1 },
    280. { "source": 64, "target": 55, "value": 5 },
    281. { "source": 64, "target": 62, "value": 12 },
    282. { "source": 64, "target": 48, "value": 5 },
    283. { "source": 64, "target": 63, "value": 4 },
    284. { "source": 64, "target": 58, "value": 10 },
    285. { "source": 64, "target": 61, "value": 6 },
    286. { "source": 64, "target": 60, "value": 2 },
    287. { "source": 64, "target": 59, "value": 9 },
    288. { "source": 64, "target": 57, "value": 1 },
    289. { "source": 64, "target": 11, "value": 1 },
    290. { "source": 65, "target": 63, "value": 5 },
    291. { "source": 65, "target": 64, "value": 7 },
    292. { "source": 65, "target": 48, "value": 3 },
    293. { "source": 65, "target": 62, "value": 5 },
    294. { "source": 65, "target": 58, "value": 5 },
    295. { "source": 65, "target": 61, "value": 5 },
    296. { "source": 65, "target": 60, "value": 2 },
    297. { "source": 65, "target": 59, "value": 5 },
    298. { "source": 65, "target": 57, "value": 1 },
    299. { "source": 65, "target": 55, "value": 2 },
    300. { "source": 66, "target": 64, "value": 3 },
    301. { "source": 66, "target": 58, "value": 3 },
    302. { "source": 66, "target": 59, "value": 1 },
    303. { "source": 66, "target": 62, "value": 2 },
    304. { "source": 66, "target": 65, "value": 2 },
    305. { "source": 66, "target": 48, "value": 1 },
    306. { "source": 66, "target": 63, "value": 1 },
    307. { "source": 66, "target": 61, "value": 1 },
    308. { "source": 66, "target": 60, "value": 1 },
    309. { "source": 67, "target": 57, "value": 3 },
    310. { "source": 68, "target": 25, "value": 5 },
    311. { "source": 68, "target": 11, "value": 1 },
    312. { "source": 68, "target": 24, "value": 1 },
    313. { "source": 68, "target": 27, "value": 1 },
    314. { "source": 68, "target": 48, "value": 1 },
    315. { "source": 68, "target": 41, "value": 1 },
    316. { "source": 69, "target": 25, "value": 6 },
    317. { "source": 69, "target": 68, "value": 6 },
    318. { "source": 69, "target": 11, "value": 1 },
    319. { "source": 69, "target": 24, "value": 1 },
    320. { "source": 69, "target": 27, "value": 2 },
    321. { "source": 69, "target": 48, "value": 1 },
    322. { "source": 69, "target": 41, "value": 1 },
    323. { "source": 70, "target": 25, "value": 4 },
    324. { "source": 70, "target": 69, "value": 4 },
    325. { "source": 70, "target": 68, "value": 4 },
    326. { "source": 70, "target": 11, "value": 1 },
    327. { "source": 70, "target": 24, "value": 1 },
    328. { "source": 70, "target": 27, "value": 1 },
    329. { "source": 70, "target": 41, "value": 1 },
    330. { "source": 70, "target": 58, "value": 1 },
    331. { "source": 71, "target": 27, "value": 1 },
    332. { "source": 71, "target": 69, "value": 2 },
    333. { "source": 71, "target": 68, "value": 2 },
    334. { "source": 71, "target": 70, "value": 2 },
    335. { "source": 71, "target": 11, "value": 1 },
    336. { "source": 71, "target": 48, "value": 1 },
    337. { "source": 71, "target": 41, "value": 1 },
    338. { "source": 71, "target": 25, "value": 1 },
    339. { "source": 72, "target": 26, "value": 2 },
    340. { "source": 72, "target": 27, "value": 1 },
    341. { "source": 72, "target": 11, "value": 1 },
    342. { "source": 73, "target": 48, "value": 2 },
    343. { "source": 74, "target": 48, "value": 2 },
    344. { "source": 74, "target": 73, "value": 3 },
    345. { "source": 75, "target": 69, "value": 3 },
    346. { "source": 75, "target": 68, "value": 3 },
    347. { "source": 75, "target": 25, "value": 3 },
    348. { "source": 75, "target": 48, "value": 1 },
    349. { "source": 75, "target": 41, "value": 1 },
    350. { "source": 75, "target": 70, "value": 1 },
    351. { "source": 75, "target": 71, "value": 1 },
    352. { "source": 76, "target": 64, "value": 1 },
    353. { "source": 76, "target": 65, "value": 1 },
    354. { "source": 76, "target": 66, "value": 1 },
    355. { "source": 76, "target": 63, "value": 1 },
    356. { "source": 76, "target": 62, "value": 1 },
    357. { "source": 76, "target": 48, "value": 1 },
    358. { "source": 76, "target": 58, "value": 1 }
    359. ]
    360. }
    361. });

Conclusion

I hope this article may be helpful for many readers.