使用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 提供的强大控件,支持多种图表类型和丰富的交互功能。通过本文的介绍,相信您可以快速上手并构建出满足需求的图表组件。

相关推荐
Wallace Zhang2 分钟前
SEGGER | 基于STM32F405 + Keil - RTT组件07 - J-Scope数据可视化,RTT方式 + DWT定时器时间戳
stm32·单片机
威威猫的栗子9 分钟前
用 Python Turtle 绘制经典汤姆猫:重温卡通角色的经典魅力
开发语言·python
qq_4597300312 分钟前
1-1 LCD1306显示与控制
stm32·单片机·嵌入式硬件
五羟基己醛17 分钟前
【STM32练习】基于STM32的PM2.5环境监测系统
stm32·单片机·嵌入式硬件
星辰@Sea19 分钟前
Python 实现对人的行为预测
开发语言·python
Amor风信子37 分钟前
华为OD机试真题---机房布局
java·开发语言·数据结构·算法·华为od
星霜旅人44 分钟前
Python的基础知识
开发语言·python·numpy
唐棣棣1 小时前
期末速成C++【类和对象】
开发语言·c++
lantiandianzi1 小时前
基于单片机的无绳跳绳设计
单片机·嵌入式硬件
重生之我在VS写bug1 小时前
【操作系统1】一篇文章便可入门操作系统
linux·服务器·开发语言·jvm