使用lvgl9 的 Chart (lv_chart) 控件指南

文章目录


前言

图表是数据可视化的重要工具,lv_chart 是 LittlevGL 提供的一个灵活的控件,用于展示数据点和趋势。它支持多种图表类型(折线图、柱状图、散点图等)以及丰富的交互功能,如滚动、缩放和光标跟踪。本文将详细介绍 lv_chart 的功能、用法及示例代码。


主体介绍

1. 图表概述

lv_chart 支持以下功能:

  • 图表类型:折线图、柱状图、散点图。
  • 双 y 轴:支持左侧和右侧独立的 y 轴。
  • 分隔线:横向和纵向分隔线。
  • 缩放与滚动:可通过容器实现缩放与滚动。
  • 光标:动态显示特定点的坐标。

2. 样式部分

样式定义
  • LV_PART_MAIN :控制图表背景、分隔线样式,以及内容区的内边距(padding)。对于柱状图,pad_column 控制同一索引的列间距。
  • LV_PART_ITEMS:控制折线、柱状图的样式,包括线条宽度、颜色、点的半径等。
  • LV_PART_INDICATOR:用于折线图或散点图中点的样式(小圆点或方块)。
  • LV_PART_CURSOR:用于设置光标的样式,如颜色、宽度和形状。

3. 图表功能

图表类型

lv_chart 支持以下图表类型:

  • LV_CHART_TYPE_NONE:不显示任何数据。
  • LV_CHART_TYPE_LINE:折线图。
  • LV_CHART_TYPE_BAR:柱状图。
  • LV_CHART_TYPE_SCATTER:散点图,支持点与点之间连线。

设置图表类型的示例:

c 复制代码
lv_chart_set_type(chart, LV_CHART_TYPE_LINE); // 设置为折线图

数据系列

图表可以包含多个数据系列,每个系列独立表示一组数据。添加数据系列的方法:

c 复制代码
lv_chart_series_t *ser = lv_chart_add_series(chart, lv_color_blue(), LV_CHART_AXIS_PRIMARY_Y); 
// 创建一个与左侧 y 轴关联的蓝色数据系列

如果需要动态更新数据,可以使用外部数组:

c 复制代码
static int32_t data_array[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
lv_chart_set_ext_y_array(chart, ser, data_array); // 绑定外部数组到数据系列

数据更新后,调用以下函数刷新图表:

c 复制代码
lv_chart_refresh(chart);

数据修改

您可以通过以下几种方式修改数据:

  1. 直接设置值

    c 复制代码
    ser->y_points[3] = 50; // 修改第 4 个点的值为 50
    lv_chart_refresh(chart);
  2. 按索引设置值

    c 复制代码
    lv_chart_set_value_by_id(chart, ser, 2, 75); // 修改第 3 个点的值为 75
  3. 顺序追加值

    c 复制代码
    lv_chart_set_next_value(chart, ser, 85); // 将值 85 追加到数据系列中
  4. 初始化所有点

    c 复制代码
    lv_chart_set_all_value(chart, ser, 0); // 初始化所有点为 0

对于散点图,可通过以下方法设置 x 和 y 值:

c 复制代码
lv_chart_set_next_value2(chart, ser, 15, 20); // 追加 (15, 20) 点到散点图

更新模式

lv_chart_set_next_value() 支持两种更新模式:

  • LV_CHART_UPDATE_MODE_SHIFT:将旧数据左移,新增数据添加到右侧。
  • LV_CHART_UPDATE_MODE_CIRCULAR:循环更新数据,类似于心电图效果。

设置更新模式的示例:

c 复制代码
lv_chart_set_update_mode(chart, LV_CHART_UPDATE_MODE_SHIFT);

数据点个数

可以使用以下方法设置每个数据系列的点数量:

c 复制代码
lv_chart_set_point_count(chart, 20); // 设置每个数据系列包含 20 个点

注意:外部数组的大小需与点数一致。


轴范围

可以通过以下方法设置 y 轴的范围:

c 复制代码
lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 100); // 设置左 y 轴范围为 0 到 100

分隔线

设置横向和纵向分隔线的数量:

c 复制代码
lv_chart_set_div_line_count(chart, 4, 6); // 设置 4 条水平线和 6 条垂直线

光标

可以为图表添加光标以显示特定点的坐标:

c 复制代码
lv_chart_cursor_t *cursor = lv_chart_add_cursor(chart, lv_color_red(), LV_DIR_VER); // 添加红色垂直光标

设置光标位置:

c 复制代码
lv_point_t point = {10, 50}; // 光标位置
lv_chart_set_cursor_pos(chart, cursor, &point);

4. 事件处理

当用户点击某个点时,会触发 LV_EVENT_VALUE_CHANGED 事件:

c 复制代码
void chart_event_cb(lv_event_t *e) {
    lv_obj_t *chart = lv_event_get_target(e);
    int point_id = lv_chart_get_pressed_point(chart); // 获取被点击点的索引
    printf("Pressed point: %d\n", point_id);
}
lv_obj_add_event_cb(chart, chart_event_cb, LV_EVENT_VALUE_CHANGED, NULL);

5. 完整示例代码

以下示例展示了如何创建一个包含折线图和光标的动态图表:

c 复制代码
#include "lvgl.h"

void chart_event_cb(lv_event_t *e) {
    lv_obj_t *chart = lv_event_get_target(e);
    int point_id = lv_chart_get_pressed_point(chart);
    if (point_id >= 0) {
        printf("Pressed point index: %d\n", point_id);
    }
}

void create_chart_demo() {
    // 创建图表对象
    lv_obj_t *chart = lv_chart_create(lv_scr_act());
    lv_obj_set_size(chart, 300, 200);
    lv_obj_center(chart);

    // 设置图表类型为折线图
    lv_chart_set_type(chart, LV_CHART_TYPE_LINE);

    // 添加数据系列
    lv_chart_series_t *ser = lv_chart_add_series(chart, lv_color_blue(), LV_CHART_AXIS_PRIMARY_Y);

    // 初始化数据
    lv_chart_set_point_count(chart, 10);
    lv_chart_set_all_value(chart, ser, 50);

    // 添加光标
    lv_chart_cursor_t *cursor = lv_chart_add_cursor(chart, lv_color_red(), LV_DIR_VER);

    // 设置光标位置
    lv_point_t point = {5, 75};
    lv_chart_set_cursor_pos(chart, cursor, &point);

    // 注册事件回调
    lv_obj_add_event_cb(chart, chart_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

int main() {
    lv_init();
    create_chart_demo();
    while (1) {
        lv_task_handler();
    }
}

运行以上代码,您将看到一个动态的折线图,支持光标操作和数据更新。通过点击图表上的点,可以触发事件并获取点的索引。


总结

lv_chart 是 LittlevGL 提供的强大控件,支持多种图表类型和丰富的交互功能。通过本文的介绍,相信您可以快速上手并构建出满足需求的图表组件。

相关推荐
Percep_gan3 分钟前
解决java.security.InvalidKeyException: Illegal key size
java·开发语言
西部秋虫28 分钟前
YOLO 训练车牌定位模型 + OpenCV C++ 部署完整步骤
c++·python·yolo·车牌识别
CryptoPP1 小时前
使用 KLineChart 这个轻量级的前端图表库
服务器·开发语言·前端·windows·后端·golang
18你磊哥1 小时前
chromedriver.exe的使用和python基本处理
开发语言·python
小坏讲微服务1 小时前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发
Kiri霧1 小时前
Scala 循环控制:掌握 while 和 for 循环
大数据·开发语言·scala
闲人编程1 小时前
Python的抽象基类(ABC):定义接口契约的艺术
开发语言·python·接口·抽象类·基类·abc·codecapsule
qq_172805591 小时前
Go 语言结构型设计模式深度解析
开发语言·设计模式·golang
无垠的广袤2 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
lkbhua莱克瓦242 小时前
集合进阶8——Stream流
java·开发语言·笔记·github·stream流·学习方法·集合