Highcharts使用小心得

本文分享了使用Highcharts开发移动端图表的应用经验,包括组件封装、交互问题解决、自定义提示框样式调整等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前使用Highcharts是开发手机端的一些图表页面,相对于交互的要求,这边在开发的过程中遇到了一些问题。目前总结一些问题和解决方法。

1、Highcharts封装

由于Highcharts开发会多处用到,所以我这边进行了封装,目前我还是用的angularJs1.0系列,这边直接贴代码。

<div id="container1" style="min-width: 310px; height: 400px; margin: 0 auto;margin-top: 20px;"></div>
<div chart-dean data-id="containerId1"  data-chart="chart" data-x="5" data-y="15" data-chart-type="chartType" data-y-axis="yAxis1" data-options="plotOptions" data-stack="true" data-series="series1" data-callback="getBudgetExecution"></div>

.directive("chartDean", [function () {
    return {
        restrict: 'EA',
        scope: {
            x: "=",
            id: "=",
            y: "=",
            series: "=",
            callback: "=",
            stack: "=",
            chartType:"=",
            legendEnabled: "=",
            footerFormat: "=",
            headerFormat: "=",
            options: "=",
            verticalAlign: "=",
            yAxis: "="
        },
        template: "",
        link: function ($scope, element, attributes) {
            $(function () {
                $scope.chart = Highcharts.chart($scope.id, {
                    credits: {
                        enabled: false
                    },
                    chart:{
                        type:$scope.chartType,
                        marginTop:"40",
                        zoomType: 'x',
                        panning:true
                    },
                    title: {
                        text: null
                    },
                    exporting: {
                        enabled: false
                    },
                    xAxis: [{
                        labels: {
                            style: {
                                color: "#222",
                                "font-size": "10px",
                                whiteSpace: 'inherit',
                                textOverflow: 'none'
                            }
                        },
                        categories: [],
                        gridLineDashStyle: "Solid",
                        gridLineWidth: "0.5px",
                        gridLineColor: '#ddd'
                    }],
                    yAxis: $scope.yAxis,
                    tooltip: {
                        formatter: function () {
                            var s = "";
                            if($scope.footerFormat){
                                s = $scope.footerFormat(this);
                            }else{
                                angular.forEach(this.points, function (item) {
                                    s += item.series.name + ':' + item.y + '<br/>';
                                });
                            }
                            return s;
                        },
                        backgroundColor: "white",
                        borderWidth: 1,
                        borderRadius: 10,
                        shared: true,
                        followTouchMove:false,
                        style: {
                            "color": "#222",
                            "cursor": "default"
                        },
                        borderColor: "#ddd"
                    },
                    plotOptions: $scope.options ? $scope.options : {
                        column: {
                            stacking: $scope.stack ? null : 'normal'
                        }
                    },
                    legend: {
                        enabled:!$scope.legendEnabled,
                        align: 'center',
                        verticalAlign: $scope.verticalAlign ? $scope.verticalAlign : 'bottom',
                        borderRadius: 0,
                        itemStyle: {color: '#222',"font-size": "12px","font-weight": "normal",lineHeight: '20px'},
                        itemMarginTop: 5,
                        itemMarginBottom: 10,
                        symbolRadius: 0,
                        shadow: false
                    },
                    series: $scope.series
                });
                $scope.callback($scope.chart);
            });
        }
    };
}])
以上封装可接受的传参可以进行去Highcharts官网去查询API。
附送地址:https://api.hcharts.cn/highcharts#chart.width

接下来进入正题。

2、在开发的过程中,页面初始化后,第一次点击图表没有弹出提示框,但是点击第二次开始之后会正常。后来发现是使用了老版本的Highcharts。更新Highcharts版本之后不再有问题。

3、在开发的过程中,交互需要提示框的形状是这样的,但是Highcharts可以在一个表中多条数据不共享的情况下允许你选择弹出框的样式。但是一旦数据共享只会显示长方形框(即tooltip中的shared属性为true),无法显示上述图中的提示框。后来使用Highcharts的useHtml属性去自己写,但是会出现一个问题,手机屏幕太小,数据太多,因还需根据不同的位置,提示框显示在不同的地方,防止最后一条数据的提示框显示在屏幕之外,所以跟交互沟通,决定使用Highcharts自带的提示框,修改其样式,尽量保持一致。(我认为开发的过程中,如果因为一些小的东西,但是会增加很多工作量,这样是可以跟交互进行沟通,但是一些工作量比较小的,虽然需要去研究一下,可以去尽力的跟交互保持一致,毕竟我认为前端是直接面向客户,能尽量跟交互保持一致,尽量保持一致)。


4、以上在开中,我遇到两个难解决的问题。

 4.1、如何让B线做到像Highcharts标识线一样,从最左端到最右端,因为如果用数据去塞给B,例如,给B的数据都是一样的,这样可以弄出一条线,但是起点和终点都是在aa的中间到gg的中间,无法做到从最左端到最右端,所以想出了一个办法,在series中加入B,但是不往B里塞数据,只是在Y轴上画一条标识线,如果在提示框中也需要展示其数据,可以自己定义tooltip展示的内容。

 4.2、如何让这一条标识的刻度值显示在Y轴

    一开始想的是,展示一条线,然后把这条线的刻度值,在获取数据之后,获取Y轴的所有刻度值,然后往刻度数组中push进标识线的值,然后进行排序,这样就OK了,但是有一个问题,当标识线的刻度值于其中一个刻度值很接近的时候,是会造成重叠的,所以这个是有问题的,后来相除一个办法,当相邻的两个刻度值小于刻度间值得1/5的时候,把标识线相邻的刻度减小或者增大,这样可以接近问题,但是用户体验感不好,被一些人否定。

    最后的解决方案是:不在刻度上展示,只是在标识线上展示text,然后调整样式,使他像在Y轴的刻度,如果被遮挡,刻度根据两个刻度值小于刻度间值得1/5的时候,调整text的Y进行移动(官网有API,查看一下就可以了解),目前亲测是1/5以下会重叠,以上不会重叠,所以1/5以上不会进行处理,这样就完美的解决问题。


5、平移功能


目前Highcharts只支持在初始化图的时候,进行放大才能进行平移,平移也分两个手指平移和单个手指平移,由于放大是两个手指进行操作,所以我建议移动是单个手指去操作。HighchartsApi中的

zoomType: 'x',
panning:true




以上是目前所遇到的一些问题,以后继续开发中会遇到的问题会及时的更新到博客中。

电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
内容概要:本文详细介绍了IEEE论文《Predefined-Time Sensorless Admittance Tracking Control for Teleoperation Systems With Error Constraint and Personalized Compliant Performance》的复现与分析。论文提出了一种预定义时间的无传感器导纳跟踪控制方案,适用于存在模型不确定性的遥操作系统。该方案通过具有可调刚度参数的导纳结构和预定义时间观测器(PTO),结合非奇异预定义时间终端滑模流形和预定义时间性能函数,实现了快速准确的导纳轨迹跟踪,并确保误差约束。文中详细展示了系统参数定义、EMG信号处理、预定义时间观测器、预定义时间控制器、可调刚度导纳模型及主仿真系统的代码实现。此外,还增加了动态刚度调节器、改进的广义动量观测器和安全约束模块,以增强系统的鲁棒性和安全性。 适合人群:具备一定自动化控制理论基础和编程能力的研究人员、工程师,尤其是从事机器人遥操作、人机交互等领域工作的专业人士。 使用场景及目标:①理解预定义时间控制理论及其在遥操作系统中的应用;②掌握无传感器力观测技术,减少系统复杂度;③学习如何利用肌电信号实现个性化顺应性能调整;④探索如何在保证误差约束的前提下提高系统的响应速度和精度。 阅读建议:本文内容涉及较多的数学推导和技术细节,建议读者先熟悉基本的控制理论和Python编程,重点理解各个模块的功能和相互关系。同时,可以通过运行提供的代码示例,加深对理论概念的理解,并根据自身需求调整参数进行实验验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值