LVGL-lv_chart

21 lvgl 柱状图图效果实现 【代码】21 lvgl 折线图效果实现。 阅读详情

下面图片从左到右,依次是折线图、区域图、锚点图

​​​​​​​

 

可以看到,这里的代码还是相对比较多的,不过其实也没有那么复杂,大多数还是在设置每个点的数据而已,那么这里我们先分析几个比较重要的API,首先就是图表类型,上面几幅图中我们展示了好几种图表类型,其实我们通过lv_chart_set_type这个函数就可以很简单的设置我们所要显示的图表类型,那么默认的类型有哪些呢?我们还是来看一下图表类型的枚举结构体:

** Chart types*/
enum {
    LV_CHART_TYPE_NONE          = 0x00, /**< 不显示(隐藏)*/
    LV_CHART_TYPE_LINE          = 0x01, /**< 折线*/
    LV_CHART_TYPE_COLUMN        = 0x02, /**< 柱形*/
    LV_CHART_TYPE_POINT         = 0x04, /**< 点*/
    LV_CHART_TYPE_VERTICAL_LINE = 0x08, /**< 竖直线*/
    LV_CHART_TYPE_AREA          = 0x10, /**< 区域*/

};

typedef uint8_t lv_chart_type_t;
static void chart_test(void)
{
    /*Create chart1*/
    lv_obj_t * chart1;
    chart1 = lv_chart_create(lv_scr_act(), NULL);
    lv_obj_set_size(chart1, 200, 150);
    lv_obj_align(chart1, NULL, LV_ALIGN_CENTER, 0, 0);
    lv_chart_set_type(chart1, LV_CHART_TYPE_AREA );   /*Show lines and points too*/
    lv_chart_set_series_opa(chart1, LV_OPA_70);       /*Opacity of the data series*/
    lv_chart_set_series_width(chart1, 4);            /*Line width and point radious*/
	  lv_chart_set_range(chart1, 0, 100);
	
		/*Create chart2*/
	  lv_obj_t * chart2;
    chart2 = lv_chart_create(lv_scr_act(), NULL);
    lv_obj_set_size(chart2, 200, 150);
    lv_obj_align(chart2, NULL, LV_ALIGN_CENTER, -250, 0);
    lv_chart_set_type(chart2, LV_CHART_TYPE_LINE );   /*Show lines and points too*/
    lv_chart_set_series_opa(chart2, LV_OPA_70);       /*Opacity of the data series*/
    lv_chart_set_series_width(chart2, 4);            /*Line width and point radious*/
		lv_chart_set_range(chart2, 0, 100);
	
		/*Create chart3*/
		lv_obj_t * chart3;
    chart3 = lv_chart_create(lv_scr_act(), NULL);
    lv_obj_set_size(chart3, 200, 150);
    lv_obj_align(chart3, NULL, LV_ALIGN_CENTER, 250, 0);
    lv_chart_set_type(chart3, LV_CHART_TYPE_POINT );   /*Show lines and points too*/
    lv_chart_set_series_opa(chart3, LV_OPA_70);       /*Opacity of the data series*/
    lv_chart_set_series_width(chart3, 4);            /*Line width and point radious*/
		lv_chart_set_range(chart3, 0, 100);
	
    /*Add two data series*/
    lv_chart_series_t * ser1 = lv_chart_add_series(chart1, LV_COLOR_RED);
    lv_chart_series_t * ser2 = lv_chart_add_series(chart1, LV_COLOR_GREEN);

    /*Set the next points on 'dl1'*/
    lv_chart_set_next(chart1, ser1, 10);
    lv_chart_set_next(chart1, ser1, 10);
    lv_chart_set_next(chart1, ser1, 10);
    lv_chart_set_next(chart1, ser1, 10);
    lv_chart_set_next(chart1, ser1, 10);
    lv_chart_set_next(chart1, ser1, 10);
    lv_chart_set_next(chart1, ser1, 10);
    lv_chart_set_next(chart1, ser1, 30);
    lv_chart_set_next(chart1, ser1, 70);
    lv_chart_set_next(chart1, ser1, 90);

    /*Directly set points on 'dl2'*/
    ser2->points[0] = 90;
    ser2->points[1] = 70;
    ser2->points[2] = 65;
    ser2->points[3] = 65;
    ser2->points[4] = 65;
    ser2->points[5] = 65;
    ser2->points[6] = 65;
    ser2->points[7] = 65;
    ser2->points[8] = 65;
    ser2->points[9] = 65;

    lv_chart_refresh(chart1); /*Required after direct set*/
		
		    /*Add two data series*/
    lv_chart_series_t * ser3 = lv_chart_add_series(chart2, LV_COLOR_RED);
    lv_chart_series_t * ser4 = lv_chart_add_series(chart2, LV_COLOR_GREEN);

    /*Set the next points on 'dl1'*/
    lv_chart_set_next(chart2, ser3, 10);
    lv_chart_set_next(chart2, ser3, 10);
    lv_chart_set_next(chart2, ser3, 10);
    lv_chart_set_next(chart2, ser3, 10);
    lv_chart_set_next(chart2, ser3, 10);
    lv_chart_set_next(chart2, ser3, 10);
    lv_chart_set_next(chart2, ser3, 10);
    lv_chart_set_next(chart2, ser3, 30);
    lv_chart_set_next(chart2, ser3, 70);
    lv_chart_set_next(chart2, ser3, 90);

    /*Directly set points on 'dl2'*/
    ser4->points[0] = 90;
    ser4->points[1] = 70;
    ser4->points[2] = 65;
    ser4->points[3] = 65;
    ser4->points[4] = 65;
    ser4->points[5] = 65;
    ser4->points[6] = 65;
    ser4->points[7] = 65;
    ser4->points[8] = 65;
    ser4->points[9] = 65;

    lv_chart_refresh(chart2); /*Required after direct set*/
		
		    /*Add two data series*/
    lv_chart_series_t * ser5 = lv_chart_add_series(chart3, LV_COLOR_RED);
    lv_chart_series_t * ser6 = lv_chart_add_series(chart3, LV_COLOR_GREEN);

    /*Set the next points on 'dl1'*/
    lv_chart_set_next(chart3, ser5, 10);
    lv_chart_set_next(chart3, ser5, 10);
    lv_chart_set_next(chart3, ser5, 10);
    lv_chart_set_next(chart3, ser5, 10);
    lv_chart_set_next(chart3, ser5, 10);
    lv_chart_set_next(chart3, ser5, 10);
    lv_chart_set_next(chart3, ser5, 10);
    lv_chart_set_next(chart3, ser5, 30);
    lv_chart_set_next(chart3, ser5, 70);
    lv_chart_set_next(chart3, ser5, 90);

    /*Directly set points on 'dl2'*/
    ser6->points[0] = 90;
    ser6->points[1] = 70;
    ser6->points[2] = 65;
    ser6->points[3] = 65;
    ser6->points[4] = 65;
    ser6->points[5] = 65;
    ser6->points[6] = 65;
    ser6->points[7] = 65;
    ser6->points[8] = 65;
    ser6->points[9] = 65;

    lv_chart_refresh(chart3); /*Required after direct set*/
}


默认的图表类型一共有这些,而且图表类型还可以叠加,比如我们想要即画点又连起曲线来,可以这样设置:

lv_chart_set_type(chart, LV_CHART_TYPE_LINE | LV_CHART_TYPE_POINT);

然后是lv_chart_set_series_opa这个函数,其主要作用是设置我们画的点或者柱形的透明度的,取值范围是 0 ~ 255,0的时候是完全透明,255的时候完全不透明,这里的透明与不透明是相对于我们的网格来说的。

再就是lv_chart_set_series_width这个函数,主要是就是设置我们画的点的直径或者线宽等,当然对区域覆盖的图表类型来说是不起作用的。

然后lv_chart_set_range这个函数是设置的数据区间,就是我们纵坐标的最小值和最大值。

设置完上面的这些基本属性后,就是给我们的图表设置数据了,毕竟图表的作用就是用来展示数据的,再填充数据前我们要先增加图表序列,就是那根红线或者绿线,我们通过lv_chart_add_series这个函数去增加,其中第二个参数是数据点的颜色,返回值是指向图表序列结构的一个指针结构体,那么这个结构体都有哪些成员呢,我们可以看一下源码:

1typedef struct
2{
3    lv_coord_t * points;
4    lv_color_t color;
5    uint16_t start_point;
6} lv_chart_series_t;

那么我们可以通过例程的两种方式向图表数据,第一种就是通过lv_chart_set_next函数不断的去填充数据,其中第一个参数是我们的图表对象,然后第二个参数是我们的数据序列对象,第三个参数是我们的数据值,我们还可以用第二种方式去设置我们的图表中的数据,就是直接对结构体成员的每个数据点直接复制,不过最重要的是在我们设置完成数据后,一定要调用lv_chart_refresh这个函数,否则数据是不会刷新显示的!

#include "gui_user.h"

static void update_chart(lv_task_t *t);
static void obj_event_cb(lv_obj_t * obj, lv_event_t event);



static const uint8_t *list_value_x = "0\n1\n2\n3\n4\n5\n6\n7\n\8\n\9";
static const uint8_t *list_value_y = "100\n90\n80\n70\n60\n50\n40\n30\n20\n10\n0";


static lv_chart_series_t *ser_light;
static lv_task_t *task;


lv_obj_t * app_light_create(lv_obj_t *parent,void *user_data)
{
	(void)user_data;

	static lv_style_t style_label_info;
	static lv_style_t style_chart;

	lv_obj_t *obj = lv_app_common_int(lv_scr_act(), "光照");
	lv_obj_set_event_cb(obj, obj_event_cb);

	lv_style_copy(&style_label_info, &lv_style_plain_color);
	if (gui_current_theme == THEME_NEMO)
		style_label_info.text.color = LV_COLOR_WHITE;
	else
		style_label_info.text.color = LV_COLOR_BLACK;
	style_label_info.text.font = &gb2312_puhui16;

	lv_style_copy(&style_chart, &lv_style_plain_color);
	if (gui_current_theme == THEME_NEMO)
		style_chart.text.color = LV_COLOR_WHITE;
	else
		style_chart.text.color = LV_COLOR_BLACK;


	lv_obj_t * label = lv_label_create(obj,NULL);
	lv_label_set_style(label,LV_LABEL_STYLE_MAIN,&style_label_info);
	lv_label_set_text(label,"图表反映环境光照强度");
	lv_obj_align(label,obj,LV_ALIGN_IN_TOP_MID,0,70);

	lv_obj_t *chart = lv_chart_create(obj, NULL);		/* 创建图表控件 */
	lv_obj_align(chart, NULL, LV_ALIGN_IN_TOP_MID, 0, 120);	/* 设置位置 */
	lv_chart_set_point_count(chart, 10);					/* 设置显示的点数量 */
	lv_chart_set_series_width(chart, 4);					/* 设置线宽度 */
	lv_chart_set_range(chart, 0, 100);					/* 设置范围0-100 */
	lv_chart_set_div_line_count(chart, 9, 5);			/* 设置分割线的数量 */
	lv_chart_set_margin(chart, 50);						/* 设置标注的扩展长度 */
	lv_chart_set_type(chart, LV_CHART_TYPE_POINT | LV_CHART_TYPE_LINE);	/* 显示方式 显示点和线 */

	lv_chart_set_x_tick_texts(chart, list_value_x, 1, LV_CHART_AXIS_DRAW_LAST_TICK);	/* 设置标注的文本 */

	lv_obj_set_size(chart, 300, 300);						/* 设置控件尺寸 */

	lv_chart_set_x_tick_length(chart, 10, 10);			/* 刻度线长度 */

	lv_chart_set_y_tick_texts(chart, list_value_y, 1, LV_CHART_AXIS_DRAW_LAST_TICK);	/* 设置标注的文本 */
    lv_chart_set_y_tick_length(chart, 10, 10);			/* 刻度线长度 */

	lv_chart_set_style(chart,LV_CHART_STYLE_MAIN,&style_chart);


	ser_light = lv_chart_add_series(chart, LV_COLOR_BLUE);	/* 创建线条 */

	task = lv_task_create(update_chart, 500, LV_TASK_PRIO_LOW, chart);	/* 创建定期更新的任务 */

	return obj;
}

static void update_chart(lv_task_t *t)
{
	/* 更新图表 */
	lv_chart_set_next(t->user_data, ser_light, gui_hal_adc_light_get_ratio());
}


static void obj_event_cb(lv_obj_t * obj, lv_event_t event)
{
	switch (event)
	{
	case LV_EVENT_DELETE:
		if (task != NULL)
		{
			lv_task_del(task);
		}
		
		break;
	default:
		break;
	}
}

lvgl chart 6.1 创建一个图表对象 6.2 设置图表的大小 6.3 设置图表的对齐位置 6.4 设置图表的区域(LV_CHART_TYPE_AREA是线显示的区域,LV_CHART_TYPE_LINE表示单纯的线) 6.5 设置图表的透明度 6.6 设置数据系列的线宽或点半径(线的粗细) 6.7 设置最大或最小的Y值 6.8 设置每条数据线所具有的数据点个数,如果不设置的话,则默认值是 10 6.9 设置水平和垂直分割线 6.10 设置 y 轴的数值范围,[0,100]也是默认值 6.11 设置 y 轴的主刻度线长度 阅读详情

相关推荐

别再只用折线图了!LVGL的lv_chart散点图和柱状图还能这样玩

本文深入探讨了LVGL中lv_chart控件的散点图和柱状图高级应用,提供了详细的代码示例和实用技巧。从基础创建到样式优化,再到交互功能实现,帮助开发者突破传统折线图的局限,打造更专业的数据可视化界面。特别适合嵌入式UI开发中需要展示传感器数据、设备状态等场景。

weixin_30567225的博客 368

LVGL lv_chart图标控件(24)

lv_chart 表格控件由背景、水平垂直分割线、数据线组成 样式 例子 效果

jiang_2018的博客 3313

LVGL图表控件实战:用lv_chart在ESP32上打造实时温湿度监控界面

本文详细介绍了如何利用LVGL的图表控件lv_chart在ESP32上构建实时温湿度监控界面。从环境配置、数据采集处理到图表优化和交互功能实现,提供了完整的开发指南和性能调优建议,帮助开发者在资源受限的嵌入式设备上创建流畅的数据可视化应用。

weixin_30455023的博客 444

LVGL:拓展部件——图表 lv_chart

此控件是用于可视化的基础图形对象。

友善啊,朋友的博客 9002

LVGL图表控件lv_chart实战:在ESP32上实现实时温湿度曲线(附完整代码)

本文详细介绍了如何在ESP32平台上使用LVGL图表控件lv_chart实现实时温湿度曲线监控系统。通过完整的代码示例,讲解了从环境搭建、核心配置到性能优化的全过程,特别针对大数据量场景提供了多种优化策略,帮助开发者构建高响应性的嵌入式数据可视化界面。

weixin_30756499的博客 527

LVGL图表控件lv_chart的5个隐藏技巧:从美化样式到处理超大数据集

本文深入探讨LVGL图表控件lv_chart的5个高级技巧,从美化样式到处理超大数据集。通过多部件协同样式设计、动态更新优化、大数据集处理策略、高级图表逻辑和交互设计进阶,帮助开发者提升嵌入式UI的数据可视化效果和性能。特别适合需要处理复杂图表和实时数据的LVGL开发者。

weixin_30596735的博客 452

LVGL学习笔记 25 - 图表Chart

图表通过lv_chart_create创建。四个边分别对应主X轴,主Y轴,副X轴,副Y轴。

pq的博客 1万+

别再只用折线图了!LVGL lv_chart的散点图和双Y轴高级玩法详解

本文深入解析LVGL中lv_chart控件的高级功能,包括散点图的数据关联分析和双Y轴的多维数据对比技巧。通过实战代码示例和性能优化建议,帮助开发者突破基础图表限制,实现更专业的数据可视化效果。

weixin_30878501的博客 947

LVGL 控件之图表部件(lv_chart)

前面提过,图表部件默认只支持 10 个数据点,如果我们具有11 个数据,那么图表先显示前 10 个数据,而第 11 个数据会将图表的 10 个数据逐一往左移位,最后把第一个数据点的数值去除了。前面我们讲解到图表部件只支持 10 个数据点,如果我们使用这个函数初始化数据点,则这些数据点的数值都是一样的。此函数主要修改某个数据点的数值,前面我们讲到图表部件默认只支持 10 数据点,这些数据点是从 0 开始自增。添加到当前图表中,该函数具有八个形参,这些形参主要设置刻度线和刻度线的标签。图表默认的垂直范围为。

Projectsauron 的博客 2万+

LVGL图表控件lv_chart实战:手把手教你用ESP32打造实时温湿度监控仪表盘

本文详细介绍了如何利用LVGL的lv_chart控件在ESP32上实现实时温湿度监控仪表盘。通过硬件配置、数据采集处理和lv_chart高级功能实战,展示了双Y轴显示、实时滚动效果和交互式光标等专业功能,帮助开发者低成本打造专业级数据可视化解决方案。

weixin_30915275的博客 492

LVGL图表控件lv_chart实战:用ESP32做个实时温湿度曲线监控界面

本文详细介绍了如何利用ESP32开发板和LVGL图表控件(lv_chart)构建实时温湿度监控界面。从硬件连接到LVGL环境配置,再到图表动态更新和界面美化,提供了全流程实战技巧,帮助开发者快速实现高颜值的数据可视化应用。

weixin_30629653的博客 361

LVGL 图表(lv_chart)自定义

我们用lv_chart的折线图LV_CHART_TYPE_LINE类型,只能设置y值,x值自动增加,对于想要实现不规则折线图的我来说完全不够用散点图可自定义(x,y),设置任意点,但没线结合这两个,可以如下配置散点图,以实现自定义折线图简单来说就是隐去散点图的点,再让线显示出来就是类似如下效果实现代码。

weixin_44322019的博客 1138

别再只用折线图了!LVGL lv_chart的三种图表类型(折线/柱状/散点)深度对比与选型指南

本文深入探讨了LVGL中lv_chart组件的三种图表类型(折线图、柱状图、散点图)的适用场景与选型指南。通过分析数据特征与图表匹配逻辑,提供实际代码示例和样式定制技巧,帮助开发者在嵌入式UI开发中实现更高效的数据可视化。特别适合需要优化图表性能和视觉效果的项目场景。

weixin_33743661的博客 369

用LVGL的lv_chart给你的嵌入式设备做个实时数据仪表盘(附完整代码)

本文详细介绍了如何使用LVGL的lv_chart组件为嵌入式设备构建高性能实时数据仪表盘。从基础配置到高级功能如双Y轴、光标交互和性能优化技巧,帮助开发者快速实现温度监控、电压波动等场景的数据可视化需求,提升嵌入式GUI开发效率。

weixin_30861797的博客 408

LVGL lv_chart核心原理与STM32嵌入式图表开发实战

图表控件是嵌入式GUI中数据可视化的核心基础组件,其本质是将结构化数据映射为像素级图形输出的状态驱动系统。在LVGL框架下,lv_chart并非简单绘图接口,而是融合样式管理、坐标轴刻度计算、环形数据缓冲与惰性刷新机制的复合控件。理解其底层内存模型(如lv_chart_series_t的CCMRAM优化)、刻度三要素协同(长度/数量/区域高度)及更新策略(左平移vs环形覆盖),对资源受限MCU的实时性与稳定性至关重要。典型应用场景包括工业仪表多曲线监控、传感器数据滚动显示与按键交互式类型切换。本文深入剖析l

weixin_36001279的博客 66

LVGL lv_chart图表组件原理与嵌入式数据可视化实践

图表组件是嵌入式GUI中实现数据可视化的核心基础模块,其本质是基于整数运算的轻量级二维坐标系渲染器。原理上依赖固定长度缓冲区、整型归一化数据点、Y轴范围映射与异步脏标记刷新机制,在资源受限MCU上规避浮点计算与动态内存分配。技术价值体现在确定性实时响应、极低RAM占用及高可预测性,广泛应用于传感器监控、工业HMI、医疗设备波形显示等场景。本文深入解析lv_chart的数据线管理、增量更新模式(LV_CHART_UPDATE_MODE_SHIFT/LV_CHART_UPDATE_MODE_CIRCULAR)、

weixin_36001279的博客 60

用LVGL的lv_chart打造实时数据仪表盘:ESP32传感器数据可视化实战

本文详细介绍了如何利用LVGL的lv_chart组件在ESP32上实现实时数据仪表盘,特别适合物联网和嵌入式开发中的传感器数据可视化。通过对比LV_CHART_UPDATE_MODE_SHIFT和LV_CHART_UPDATE_MODE_CIRCULAR两种更新模式,帮助开发者选择最适合的方案,并提供了性能优化和视觉增强的实用技巧。

weixin_30410119的博客 359

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

图表是数据可视化的重要工具,lv_chart是 LittlevGL 提供的一个灵活的控件,用于展示数据点和趋势。它支持多种图表类型(折线图、柱状图、散点图等)以及丰富的交互功能,如滚动、缩放和光标跟踪。本文将详细介绍lv_chart的功能、用法及示例代码。图表概述lv_chart图表类型:折线图、柱状图、散点图。双 y 轴:支持左侧和右侧独立的 y 轴。分隔线:横向和纵向分隔线。缩放与滚动:可通过容器实现缩放与滚动。光标:动态显示特定点的坐标。

m0_62599305的博客 2160
上一篇: LVGL lv_event事件
下一篇: LVGL-lv_img
lbaihao
博客等级 码龄18年 603粉丝 420原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值