powerFlow.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package echart
  2. import (
  3. "github.com/go-echarts/go-echarts/v2/charts"
  4. "github.com/go-echarts/go-echarts/v2/opts"
  5. "github.com/go-echarts/go-echarts/v2/types"
  6. )
  7. type PowerFlowChartOpt struct {
  8. Global ChartOpt
  9. }
  10. type PowerFlowChartData struct {
  11. Legend string // 图例名称
  12. Color *string // 图例颜色
  13. Stack *string // 图例堆叠名称,相同的名称会堆叠到一起
  14. Data []opts.LineData
  15. }
  16. type SocChartData struct {
  17. Color *string // 图例颜色
  18. Data []opts.LineData
  19. }
  20. func CreatePowerFlowChart(opt LineChartOpt, powerFlowData []PowerFlowChartData, socData SocChartData) *charts.Line {
  21. pfChart := charts.NewLine()
  22. pfChart.SetGlobalOptions(
  23. charts.WithInitializationOpts(opts.Initialization{
  24. Theme: types.ThemeShine,
  25. Width: "1280px",
  26. Height: "500px",
  27. }),
  28. charts.WithGridOpts(
  29. opts.Grid{Top: "60", Height: "35%"}, // 上图 grid
  30. opts.Grid{Top: "55%", Height: "35%"}, // 下图 grid
  31. ),
  32. charts.WithTooltipOpts(opts.Tooltip{
  33. Trigger: "axis",
  34. AxisPointer: &opts.AxisPointer{Type: "cross"},
  35. BackgroundColor: "#ffffff", // 白色背景,不透明
  36. BorderColor: "#333333",
  37. }),
  38. charts.WithXAxisOpts(opts.XAxis{
  39. Type: "time", // ⏰ 时间轴关键设置
  40. Show: opts.Bool(false), // 上图隐藏 X 轴标签
  41. GridIndex: 0,
  42. }),
  43. charts.WithYAxisOpts(opts.YAxis{
  44. Name: "功率(kw)",
  45. GridIndex: 0,
  46. }),
  47. charts.WithLegendOpts(opts.Legend{
  48. Show: opts.Bool(true),
  49. }),
  50. charts.WithDataZoomOpts(
  51. opts.DataZoom{
  52. Type: "slider",
  53. XAxisIndex: []int{0, 1},
  54. Start: 0,
  55. End: 100,
  56. },
  57. opts.DataZoom{
  58. Type: "inside",
  59. XAxisIndex: []int{0, 1},
  60. Start: 0,
  61. End: 100,
  62. },
  63. ),
  64. )
  65. pfChart.ExtendXAxis(opts.XAxis{
  66. Type: "time",
  67. GridIndex: 1,
  68. })
  69. pfChart.ExtendYAxis(opts.YAxis{
  70. Name: "SOC(%)",
  71. GridIndex: 1,
  72. })
  73. // 插入上图(功率)数据
  74. for _, d := range powerFlowData {
  75. areaOpt := []charts.SeriesOpts{}
  76. areaChartOpt := opts.LineChart{}
  77. areaChartOpt.Smooth = opts.Bool(true)
  78. areaChartOpt.Symbol = "none"
  79. if d.Stack != nil {
  80. areaChartOpt.Stack = *d.Stack
  81. }
  82. areaChartOpt.YAxisIndex = 0
  83. areaChartOpt.XAxisIndex = 0
  84. areaOpt = append(areaOpt, charts.WithLineChartOpts(areaChartOpt))
  85. areaOpt = append(areaOpt, charts.WithAreaStyleOpts(opts.AreaStyle{
  86. Opacity: opts.Float(0.4),
  87. }))
  88. if d.Color != nil {
  89. areaOpt = append(areaOpt, charts.WithItemStyleOpts(opts.ItemStyle{
  90. Color: *d.Color, // 自定义每个系列颜色
  91. }))
  92. }
  93. pfChart.AddSeries(d.Legend, d.Data, areaOpt...)
  94. }
  95. // 插入下图(SOC)数据
  96. lineOpt := []charts.SeriesOpts{}
  97. lineOpt = append(lineOpt, charts.WithLineChartOpts(opts.LineChart{
  98. Smooth: opts.Bool(true),
  99. Symbol: "none",
  100. YAxisIndex: 1,
  101. XAxisIndex: 1,
  102. }))
  103. if socData.Color != nil {
  104. lineOpt = append(lineOpt, charts.WithItemStyleOpts(opts.ItemStyle{
  105. Color: *socData.Color, // 自定义每个系列颜色
  106. }))
  107. }
  108. pfChart.AddSeries("SOC", socData.Data, lineOpt...)
  109. return pfChart
  110. }