使用 HighCharts 和 DotNet.HighCharts 来“玩”多个系列

2023-12-23

我有一组使用 VB.NET 和 DotNet.HighCharts 创建的系列:

Dim SeriesList4As New List(Of Series)(stfipsList4.Count)

我想要发生的是类似的事情http://jsfiddle.net/8M2fF/ http://jsfiddle.net/8M2fF/除了我希望能够在不事先知道我有多少个系列的情况下传递多个系列。

创建上述示例的 VB 代码如下:

        Dim stfipsList4 = (From r In dt4.AsEnumerable() Select r("areaname")).Distinct().ToList()
        Dim SeriesList4 As New List(Of Series)(stfipsList4.Count)
        Dim seriesItem4(stfipsList4.Count) As Series
        Dim xDate4 As DateTime
        Dim fakeDate4 As String
        Dim sX4 As Integer

        sX4 = 1
        For Each state In stfipsList4
            Dim data As New Dictionary(Of DateTime, Decimal)
            Dim stateVal As String = state.ToString
            Dim recCount As Integer = dt4.Rows.Count - 1
            Dim seriesPointCount As Integer = dt4.Compute("Count(population)", "areaname = '" + stateVal + "'")
            Dim chartData As Object(,) = New Object(seriesPointCount - 1, 1) {}
            Dim x As Integer = 0
            For i As Integer = 0 To recCount
                If dt4.Rows(i)("areaname").ToString = stateVal Then
                    fakeDate4 = "1/1/" + dt4.Rows(i)("periodyear").ToString
                    xDate4 = DateTime.Parse(fakeDate4)
                    chartData.SetValue(xDate4.Date, x, 0)
                    chartData.SetValue(dt4.Rows(i)("population"), x, 1)
                    x += 1
                End If

            Next

            seriesItem4(sX4) = New Series With {
                        .Name = state.ToString, _
                        .Data = New Helpers.Data(chartData)
            }

            SeriesList4.Add(seriesItem4(sX4))

            sX4 = sX4 + 1
        Next

        Dim iterateData As String = JsonSerializer.Serialize(seriesItem4(1))

            Dim chart4 As Highcharts = New Highcharts("chart4").SetOptions(New Helpers.GlobalOptions() With { _
                .[Global] = New [Global]() With { _
                        .UseUTC = False _
                    } _
                }).InitChart(New Chart() With { _
                 .DefaultSeriesType = ChartTypes.Column, _
                 .MarginRight = 10, _
                 .Events = New ChartEvents() With { _
                  .Load = "ChartEventsLoad" _
                 } _
                }).SetTitle(New Title() With { _
                 .Text = "Population" _
                }).SetTooltip(New Tooltip() With { _
                    .Formatter = "function() { return '<b>' + this.series.name + '<br/>' + Highcharts.dateFormat('%Y', this.x) +'</b>: '+ Highcharts.numberFormat(this.y, 0, ','); }" _
                }).SetXAxis(New XAxis() With { _
                 .Type = AxisTypes.Datetime, _
                 .TickPixelInterval = 150 _
                }).SetYAxis(New YAxis() With { _
                       .Min = 0, _
                       .Title = New YAxisTitle() With { _
                        .Text = "Population", _
                        .Align = AxisTitleAligns.High _
                        } _
                }).SetSeries(New Series() With { _
                     .Data = New Helpers.Data(New Object() {}) _
                }) _
                .SetOptions(New Helpers.GlobalOptions() With { _
                .Colors = palette_colors _
                }) _
                .AddJavascripVariable("iterated", iterateData.ToString) _
                .AddJavascripFunction("ChartEventsLoad", "// set up the updating of the chart each second" & vbCr & vbLf & _
                                  " var result = iterated.data;" & vbCr & vbLf & _
                                  " var counter = 0;" & vbCr & vbLf & _
                                  " var series = this.series[0];" & vbCr & vbLf & _
                                  " var loopseries = function() {" & vbCr & vbLf & _
                                  " if (counter <= result.length) {" & vbCr & vbLf & _
                                  " var p = String(result[counter]);" & vbCr & vbLf & _
                                  " var splitp = p.split("","");" & vbCr & vbLf & _
                                  " var x = Number(splitp[0]);" & vbCr & vbLf & _
                                  " var y = Number(splitp[1]);" & vbCr & vbLf & _
                                  " series.addPoint([x, y], true, series.points.length > 10, true);" & vbCr & vbLf & _
                                  " counter++;" & vbCr & vbLf & _
                                  " } else {" & vbCr & vbLf & _
                                  " clearInterval(loopseries);" & vbCr & vbLf & _
                                  " }};" & vbCr & vbLf & _
                                  " setInterval(loopseries, 300);")

        ltrChart4.Text = chart4.ToHtmlString()

这仅适用于单个系列。我想传递一个列表(系列)。 需要涉及的事情: 创建 n 个系列 为每个系列添加积分 为每个系列命名

我可以处理那些只是在大师系列“列表”中传递的项目,而我无法完成这些项目。

编辑: 我的要求似乎有些混乱。我可以通过 DotNet.HighCharts API 将 N 个系列传递给 HighCharts。我目前无法做的是将同一组系列传递给 javascript 函数以循环播放并“播放”该系列。请参见:

            .AddJavascripVariable("iterated", iterateData.ToString) _
            .AddJavascripFunction("ChartEventsLoad", "// set up the updating of the chart each second" & vbCr & vbLf & _
                              " var result = iterated.data;" & vbCr & vbLf & _
                              " var counter = 0;" & vbCr & vbLf & _
                              " var series = this.series[0];" & vbCr & vbLf & _
                              " var loopseries = function() {" & vbCr & vbLf & _
                              " if (counter <= result.length) {" & vbCr & vbLf & _
                              " var p = String(result[counter]);" & vbCr & vbLf & _
                              " var splitp = p.split("","");" & vbCr & vbLf & _
                              " var x = Number(splitp[0]);" & vbCr & vbLf & _
                              " var y = Number(splitp[1]);" & vbCr & vbLf & _
                              " series.addPoint([x, y], true, series.points.length > 10, true);" & vbCr & vbLf & _
                              " counter++;" & vbCr & vbLf & _
                              " } else {" & vbCr & vbLf & _
                              " clearInterval(loopseries);" & vbCr & vbLf & _
                              " }};" & vbCr & vbLf & _
                              " setInterval(loopseries, 300);")

.AddJavaScriptVariable 需要一个字符串,并且内联代码给了我无效的对象引用。


我实际上使用 DotNet.Highcharts 创建一个具有未定义数量的系列的图表。为此,我使用 linq 查询需要添加到图表中的数据。我使用 object[] 列表来创建各个点,然后将该列表添加到系列列表中。我根据需要多次迭代循环以获得所有系列。然后,对于 SetSeries,我分配系列列表中包含的内容。该代码是用 C# 编写的,但我确信您可以将其更改为 VB.NET。这是我用于创建图表的整个 ActionResult:

public ActionResult CombinerBarToday(DateTime? utcStartingDate = null,
                                     DateTime? utcEndingDate = null)
{
    //GET THE GENERATED POWER READINGS FOR THE SPECIFIED DATETIME
    var firstQ = from s in db.PowerCombinerHistorys
                 join u in db.PowerCombiners on s.combiner_id equals u.id
                 where s.recordTime >= utcStartingDate
                 where s.recordTime <= utcEndingDate
                 select new
                 {
                     CombinerID = u.name,
                     Current = s.current,
                     RecordTime = s.recordTime,
                     Voltage = s.voltage,
                     Watts = (s.current * s.voltage)
                 };

    //GET A LIST OF THE COMBINERS CONTAINED IN THE QUERY
    var secondQ = (from s in firstQ
                   select new
                   {
                        Combiner = s.CombinerID
                   }).Distinct();

    /* THIS LIST OF SERIES WILL BE USED TO DYNAMICALLY ADD AS MANY SERIES 
     * TO THE HIGHCHARTS AS NEEDED WITHOUT HAVING TO CREATE EACH SERIES INDIVIUALY */
    List<Series> allSeries = new List<Series>();

    TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

    //LOOP THROUGH EACH COMBINER AND CREATE SERIES
    foreach (var distinctCombiner in secondQ)
    {
        var combinerDetail = from s in db2.PowerCombinerHistorys
                 join u in db2.PowerCombiners on s.combiner_id equals u.id
                 where u.name == distinctCombiner.Combiner
                 where s.recordTime >= utcStartingDate
                 where s.recordTime <= utcEndingDate
                 select new
                 {
                     CombinerID = u.name,
                     Current = s.current,
                     RecordTime = s.recordTime,
                     Voltage = s.voltage,
                     Watts = (s.current * s.voltage) / 1000d
                 };


        var results = new List<object[]>();

        foreach (var detailCombiner in combinerDetail)
        {
            results.Add(new object[] { 
                            TimeZoneInfo.ConvertTimeFromUtc(detailCombiner.RecordTime, easternZone), 
                            detailCombiner.Watts });
        }

        allSeries.Add(new Series
        {
            Name = distinctCombiner.Combiner,
            //Data = new Data(myData)
            Data = new Data(results.ToArray())

        });
    }

    Highcharts chart = new Highcharts("chart")
    .InitChart(new Chart { DefaultSeriesType = ChartTypes.Spline, ZoomType = ZoomTypes.X})
    .SetTitle(new Title { Text = "Combiner History" })
    .SetSubtitle(new Subtitle { Text = "Click and drag in the plot area to zoom in" })
    .SetOptions(new GlobalOptions { Global = new Global { UseUTC = false } })
    .SetPlotOptions(new PlotOptions
    {
        Spline = new PlotOptionsSpline
        {
            LineWidth = 2,
            States = new PlotOptionsSplineStates { Hover = new PlotOptionsSplineStatesHover { LineWidth = 3 } },
            Marker = new PlotOptionsSplineMarker
            {
                Enabled = false,
                States = new PlotOptionsSplineMarkerStates
                {
                    Hover = new PlotOptionsSplineMarkerStatesHover
                    {
                        Enabled = true,
                        Radius = 5,
                        LineWidth = 1
                    }
                }
            }
        }
    })
    .SetXAxis(new XAxis
    {
        Type = AxisTypes.Datetime,
        Labels = new XAxisLabels
        {
            Rotation = -45,
            Align = HorizontalAligns.Right,
            Style = "font: 'normal 10px Verdana, sans-serif'"
        },
        Title = new XAxisTitle { Text = "Time(Hour)" },
    })
    .SetYAxis(new YAxis
    {
        Title = new YAxisTitle { Text = "Kilowatt" }
    })

    .SetSeries(allSeries.Select(s => new Series {Name = s.Name, Data = s.Data }).ToArray());

    return PartialView(chart);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 HighCharts 和 DotNet.HighCharts 来“玩”多个系列 的相关文章

随机推荐

  • PHP rtrim 函数修剪多余字符?为什么?

    如何rtrim工作 我有一个字符串 4dbb3dca 我不确定我的字符串是如何格式化的 我想打电话rtrim 4dbb3dca amp edit 可能 amp 特殊字符问题 但是在我的字符串之后4dbb3dc 我希望它是4dbb3dca 有
  • C++开发值得学Eclipse吗

    据我所知 从头开始学习使用 Eclipse 是很困难的 但我会得到诸如快速源代码浏览 调用图 静态代码分析等好处 使用 Eclipse for C CDT 还能带来哪些其他好处 我学习了 C Eclipse 它非常灵活并提供许多功能 我不再
  • 使用两个 1d 数组高效索引 2d numpy 数组

    我有一个大型 2d numpy 数组和两个 1d 数组 表示 2d 数组中的 x y 索引 我想使用这些一维数组对二维数组执行操作 我可以使用 for 循环来完成此操作 但在处理大型数组时速度非常慢 有更快的方法吗 我尝试简单地使用一维数组
  • Scala:隐式传递一个隐式参数,显式传递另一个参数。是否可以?

    让我们考虑一下这个函数 def foo implicit a Int b String println a b 现在 让我们假设有一个隐含的String and Int implicit val i1 1 在范围内 但我们想传递另一个 no
  • 构建器模式与配置对象

    构建器模式在创建不可变对象时很流行 但创建构建器会产生一些编程开销 所以我想知道为什么不简单地使用配置对象 构建器的用法如下所示 Product p Product Builder name Vodka alcohol 0 38 size
  • 如何在Python中创建一组参数化函数? [复制]

    这个问题在这里已经有答案了 我正在尝试创建一系列函数 并通过 shift 参数进行参数化 考虑下面的代码 我希望 for 循环创建一组函数 每个函数都会改变 不同数量的争论 Python 3 code N 5 fns for idx in
  • 如何检查数组中是否可以求和?

    给定一个数组N整数 检查是否可以获得总和S 通过选择数组的一些 或不选择 元素并添加它们 我尝试使用贪婪方法解决这个问题 首先对数组进行排序 然后越来越接近总和 然而它不起作用 谁能告诉我应该如何解决这个问题 t int input for
  • iPhone:NSURLRequest CachePolicy 设置之间的性能差异

    使用时NSURL请求 http developer apple com iphone library documentation Cocoa Reference Foundation Classes NSURLRequest Class R
  • 什么是红/绿测试?

    我相信我已经知道答案 但我不是 100 确定 所以只是一个简单的问题 红 绿测试实际上意味着什么 我将其理解为 首先编写测试 以便它们全部失败 全部红色 然后编写代码并观察每个测试如何变成绿色 当所有测试都变成绿色时 就没事了 我在Scot
  • npm 包中的二进制文件

    我尝试创建一个 npm 包 它可以作为 shell 中的命令启动 我有package json name myapp version 0 0 6 dependencies async watch node promise rmdir sho
  • Java中的内部静态类

    使用内部静态类有什么好处 与其他选项相比 我应该在哪些方面更喜欢它 它的内存是如何分配的 如果内部类是静态的 则不需要外部类的实例来实例化它 如果内部类是公共的 那么它基本上只是一种名称范围技术 用于强调该类 属于 外部类这一事实 但是 如
  • 如何声明对本机 .so 库的依赖以进行测试?

    我在 Akka 中有一个生产应用程序 我从以下选项开始 Djava library path native with native包含库的目录libsigar amd64 linux so 一切都很好 当我打字时sbt test我面临以下错
  • ImageMagick Convert 在命令行中工作,但不能通过 PHP exec()

    我正在使用 PHPexec 使用 ImagicMagick 转换图像convert 这是在 CentOS 服务器上运行的 exec convert http www google com images srpr logo3w png jpg
  • 如何设置定时器

    有什么办法可以将计时器设置为 60 秒xor ah ah Enter Again xor ah ah I should put 60 seconds here int 16h The user should press S before 6
  • 具有 JavaScript 依赖项的聚合物元素

    我已经创建了用于渲染 markdown 的 Polymer 元素 https github com robdodson mark down它使用 Marked js 库 我想知道 加载其依赖项的推荐方式是什么 我应该只使用脚本标签吗 或者将
  • Rails 日期与 json

    我正在实施一个Facebook应用及使用AJAX JSON 但是 那JSON返回的结构具有以下格式2010 05 30T06 14 00Z 我正在打电话Game all to json在控制器动作中 如何将它们转换为正常的日期格式 从服务器
  • 在隐藏字段中传递帖子 ID 的值

    这与我的另一个问题是一致的 当我提交属于特定帖子的新评论时 试图获取正确的 post id form html erb 如果没有看到更多代码 很难确切地知道你在做什么 但我的猜测是 post 实例变量已使用设置 post Post find
  • 从 SQLite Blob 创建 Drawable 时出现问题

    我将图像文件作为 blob 缓存在 SQLite 数据库中 我在另一个平台上有一个类似的应用程序 它对相同的图像文件执行相同的操作 两个平台上的数据库报告相同图像的完全相同的大小 所以我认为 但不能保证图像数据完好无损地进入数据库 但是当我
  • Python ASCII 到二进制

    是否有一个内置函数可以将 ASCII 转换为二进制 例如 将 P 转换为 01010000 我正在使用Python 2 6 6 两个人在一起怎么样 bin ord P 0b1010000
  • 使用 HighCharts 和 DotNet.HighCharts 来“玩”多个系列

    我有一组使用 VB NET 和 DotNet HighCharts 创建的系列 Dim SeriesList4As New List Of Series stfipsList4 Count 我想要发生的是类似的事情http jsfiddle