chart.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from pathlib import Path
  2. from typing import Dict, List
  3. from ..dependencies import register_library, register_vue_component
  4. from ..element import Element
  5. dependencies = [
  6. 'lib/highcharts/highcharts.js',
  7. 'lib/highcharts/highcharts-more.js',
  8. 'lib/highcharts/highcharts-3d.js',
  9. ]
  10. optional_dependencies = [
  11. 'lib/highcharts/modules/sankey.js',
  12. 'lib/highcharts/modules/accessibility.js',
  13. 'lib/highcharts/modules/exporting.js',
  14. 'lib/highcharts/modules/export-data.js',
  15. 'lib/highcharts/modules/solid-gauge.js',
  16. 'lib/highcharts/modules/annotations-advanced.js',
  17. 'lib/highcharts/modules/annotations.js',
  18. 'lib/highcharts/modules/arc-diagram.js',
  19. 'lib/highcharts/modules/arrow-symbols.js',
  20. 'lib/highcharts/modules/boost-canvas.js',
  21. 'lib/highcharts/modules/boost.js',
  22. 'lib/highcharts/modules/broken-axis.js',
  23. 'lib/highcharts/modules/bullet.js',
  24. 'lib/highcharts/modules/coloraxis.js',
  25. 'lib/highcharts/modules/current-date-indicator.js',
  26. 'lib/highcharts/modules/datagrouping.js',
  27. 'lib/highcharts/modules/data.js',
  28. 'lib/highcharts/modules/debugger.js',
  29. 'lib/highcharts/modules/dependency-wheel.js',
  30. 'lib/highcharts/modules/dotplot.js',
  31. 'lib/highcharts/modules/draggable-points.js',
  32. 'lib/highcharts/modules/drag-panes.js',
  33. 'lib/highcharts/modules/drilldown.js',
  34. 'lib/highcharts/modules/dumbbell.js',
  35. 'lib/highcharts/modules/full-screen.js',
  36. 'lib/highcharts/modules/funnel.js',
  37. 'lib/highcharts/modules/gantt.js',
  38. 'lib/highcharts/modules/grid-axis.js',
  39. 'lib/highcharts/modules/heatmap.js',
  40. 'lib/highcharts/modules/histogram-bellcurve.js',
  41. 'lib/highcharts/modules/item-series.js',
  42. 'lib/highcharts/modules/lollipop.js',
  43. 'lib/highcharts/modules/marker-clusters.js',
  44. 'lib/highcharts/modules/networkgraph.js',
  45. 'lib/highcharts/modules/no-data-to-display.js',
  46. 'lib/highcharts/modules/offline-exporting.js',
  47. 'lib/highcharts/modules/oldie.js',
  48. 'lib/highcharts/modules/oldie-polyfills.js',
  49. 'lib/highcharts/modules/organization.js',
  50. 'lib/highcharts/modules/overlapping-datalabels.js',
  51. 'lib/highcharts/modules/parallel-coordinates.js',
  52. 'lib/highcharts/modules/pareto.js',
  53. 'lib/highcharts/modules/pathfinder.js',
  54. 'lib/highcharts/modules/pattern-fill.js',
  55. 'lib/highcharts/modules/price-indicator.js',
  56. 'lib/highcharts/modules/series-label.js',
  57. 'lib/highcharts/modules/series-on-point.js',
  58. 'lib/highcharts/modules/sonification.js',
  59. 'lib/highcharts/modules/static-scale.js',
  60. 'lib/highcharts/modules/stock.js',
  61. 'lib/highcharts/modules/stock-tools.js',
  62. 'lib/highcharts/modules/streamgraph.js',
  63. 'lib/highcharts/modules/sunburst.js',
  64. 'lib/highcharts/modules/tilemap.js',
  65. 'lib/highcharts/modules/timeline.js',
  66. 'lib/highcharts/modules/treegraph.js',
  67. 'lib/highcharts/modules/treegrid.js',
  68. 'lib/highcharts/modules/variable-pie.js',
  69. 'lib/highcharts/modules/variwide.js',
  70. 'lib/highcharts/modules/vector.js',
  71. 'lib/highcharts/modules/venn.js',
  72. 'lib/highcharts/modules/windbarb.js',
  73. 'lib/highcharts/modules/wordcloud.js',
  74. 'lib/highcharts/modules/xrange.js',
  75. 'lib/highcharts/modules/funnel3d.js',
  76. 'lib/highcharts/modules/heikinashi.js',
  77. 'lib/highcharts/modules/hollowcandlestick.js',
  78. 'lib/highcharts/modules/pyramid3d.js',
  79. 'lib/highcharts/modules/cylinder.js',
  80. ]
  81. register_vue_component(name='chart', path=Path(__file__).parent / 'chart.js')
  82. for path in dependencies:
  83. register_library(name=Path(path).stem, path=Path(__file__).parent / path)
  84. for path in optional_dependencies:
  85. register_library(name=Path(path).stem, path=Path(__file__).parent / path)
  86. class Chart(Element):
  87. def __init__(self, options: Dict, *, type: str = 'chart', extras: List[str] = []) -> None:
  88. """Chart
  89. An element to create a chart using `Highcharts <https://www.highcharts.com/>`_.
  90. Updates can be pushed to the chart by changing the `options` property.
  91. After data has changed, call the `update` method to refresh the chart.
  92. By default, a `Highcharts.chart` is created.
  93. To use, e.g., `Highcharts.stockChart` instead, set the `type` property to "stockChart".
  94. :param options: dictionary of Highcharts options
  95. :param type: chart type (e.g. "chart", "stockChart", "mapChart", ...; default: "chart")
  96. :param extras: list of extra dependencies to include (e.g. "annotations", "arc-diagram", "solid-gauge", ...)
  97. """
  98. super().__init__('chart')
  99. self._props['type'] = type
  100. self._props['options'] = options
  101. self._props['extras'] = extras
  102. self.use_component('chart')
  103. for dependency in dependencies:
  104. self.use_library(Path(dependency).stem)
  105. for extra in extras:
  106. self.use_library(extra)
  107. @property
  108. def options(self) -> Dict:
  109. return self._props['options']
  110. def update(self) -> None:
  111. super().update()
  112. self.run_method('update_chart')