9.8 KiB
Chart (lv_chart)
Overview
Charts are a basic object to visualize data points. Currently Line charts (connect points with lines and/or draw points on them) and Bar charts are supported.
Charts can have:
- division lines
- 2 y axis
- axis ticks and texts on ticks
- cursors
- scrolling and zooming
Parts and Styles
LV_PART_MAINThe background of the chart. Uses all the typical background and line (for the division lines) related style properties. Padding makes the series area smaller. For column chartspad_columnsets the space between the columns of the adjacent indices.LV_PART_SCROLLBARThe scrollbar used if the chart is zoomed. See the Base object's documentation for details.LV_PART_ITEMSRefers to the line or bar series.- Line chart: The line properties are used by the lines.
width,height,bg_colorandradiusis used to set the appearance of points. - Bar chart: The typical background properties are used to style the bars.
pad_columnsets the space between the columns on the same index.
- Line chart: The line properties are used by the lines.
LV_PART_INDICATORRefers to the points on line and scatter chart (small circles or squares).LV_PART_CURSORLine properties are used to style the cursors.width,height,bg_colorandradiusare used to set the appearance of points.LV_PART_TICKSLine and Text style properties are used to style the ticks
Usage
Chart type
The following data display types exist:
LV_CHART_TYPE_NONEDo not display any data. Can be used to hide the series.LV_CHART_TYPE_LINEDraw lines between the data points and/or points (rectangles or circles) on the data points.LV_CHART_TYPE_BAR- Draw bars.LV_CHART_TYPE_SCATTER- X/Y chart drawing point's and lines between the points. .
You can specify the display type with lv_chart_set_type(chart, LV_CHART_TYPE_...).
Data series
You can add any number of series to the charts by lv_chart_add_series(chart, color, axis). This allocates an lv_chart_series_t structure which contains the chosen color and an array for the data points.
axis can have the following values:
LV_CHART_AXIS_PRIMARY_YLeft axisLV_CHART_AXIS_SECONDARY_YRight axisLV_CHART_AXIS_PRIMARY_XBottom axisLV_CHART_AXIS_SECONDARY_XTop axis
axis tells which axis's range should be used te scale the values.
lv_chart_set_ext_y_array(chart, ser, value_array) makes the chart use an external array for the given series.
value_array should look like this: lv_coord_t * value_array[num_points]. The array size needs to be large enough to hold all the points of that series.
The array's pointer will be saved in the chart so it needs to be global, static or dynamically allocated.
Note: you should call lv_chart_refresh(chart) after the external data source has been updated to update the chart.
The value array of a series can be obtained with lv_chart_get_y_array(chart, ser), which can be used with ext_array or normal arrays.
For LV_CHART_TYPE_SCATTER type lv_chart_set_ext_x_array(chart, ser, value_array) and lv_chart_get_x_array(chart, ser) can be used as well.
Modify the data
You have several options to set the data of series:
- Set the values manually in the array like
ser1->points[3] = 7and refresh the chart withlv_chart_refresh(chart). - Use
lv_chart_set_value_by_id(chart, ser, id, value)whereidis the index of the point you wish to update. - Use the
lv_chart_set_next_value(chart, ser, value). - Initialize all points to a given value with:
lv_chart_set_all_value(chart, ser, value).
Use LV_CHART_POINT_NONE as value to make the library skip drawing that point, column, or line segment.
For LV_CHART_TYPE_SCATTER type lv_chart_set_value_by_id2(chart, ser, id, value) and lv_chart_set_next_value2(chart, ser, x_valuem y_value) can be used as well.
Update modes
lv_chart_set_next_value can behave in two ways depending on update mode:
LV_CHART_UPDATE_MODE_SHIFTShift old data to the left and add the new one to the right.LV_CHART_UPDATE_MODE_CIRCULAR- Add the new data in circular fashion, like an ECG diagram.
The update mode can be changed with lv_chart_set_update_mode(chart, LV_CHART_UPDATE_MODE_...).
Number of points
The number of points in the series can be modified by lv_chart_set_point_count(chart, point_num). The default value is 10.
Note: this also affects the number of points processed when an external buffer is assigned to a series, so you need to be sure the external array is large enough.
Handling large number of points
On line charts, if the number of points is greater than the pixels horizontally, the Chart will draw only vertical lines to make the drawing of large amount of data effective. If there are, let's say, 10 points to a pixel, LVGL searches the smallest and the largest value and draws a vertical lines between them to ensure no peaks are missed.
Vertical range
You can specify the minimum and maximum values in y-direction with lv_chart_set_range(chart, axis, min, max).
axis can be LV_CHART_AXIS_PRIMARY (left axis) or LV_CHART_AXIS_SECONDARY (right axis).
The value of the points will be scaled proportionally. The default range is: 0..100.
Division lines
The number of horizontal and vertical division lines can be modified by lv_chart_set_div_line_count(chart, hdiv_num, vdiv_num).
The default settings are 3 horizontal and 5 vertical division lines.
If there is a visible border on a side and no padding on that side, the division line would be drawn on top of the border and therefore it won't be drawn.
Override default start point for series
If you want a plot to start from a point other than the default which is point[0] of the series, you can set an alternative
index with the function lv_chart_set_x_start_point(chart, ser, id) where id is the new index position to start plotting from.
Note that LV_CHART_UPDATE_MODE_SHIFT also changes the start_point.
Tick marks and labels
Ticks and labels can be added to the axis with lv_chart_set_axis_tick(chart, axis, major_len, minor_len, major_cnt, minor_cnt, label_en, draw_size).
axiscan beLV_CHART_AXIS_X/PRIMARY_Y/SECONDARY_Ymajor_lenis the length of major ticksminor_lenis the length of minor ticksmajor_cntis the number of major ticks on the axisminor_cntin the number of minor ticks between two major tickslabel_entrue: enable label drawing on major ticksdraw_sizeextra size required to draw the tick and labels (start with 20 px and increase if the ticks/labels are clipped)
Zoom
The chart can be zoomed independently in x and y directions with lv_chart_set_zoom_x(chart, factor) and lv_chart_set_zoom_y(chart, factor).
If factor is 256 there is no zoom. 512 means double zoom, etc. Fractional values are also possible but < 256 value is not allowed.
Cursor
A cursor can be added with lv_chart_cursor_t * c1 = lv_chart_add_cursor(chart, color, dir);.
The possible values of dir LV_DIR_NONE/RIGHT/UP/LEFT/DOWN/HOR/VER/ALL or their OR-ed values to tell in which direction(s) should the cursor be drawn.
lv_chart_set_cursor_pos(chart, cursor, &point) sets the position of the cursor.
pos is a pointer to an lv_point_t variable. E.g. lv_point_t point = {10, 20};. If the chart is scrolled the cursor will remain in the same place.
lv_chart_get_point_pos_by_id(chart, series, id, &point_out) gets the coordinate of a given point. It's useful to place the cursor at a given point.
lv_chart_set_cursor_point(chart, cursor, series, point_id) sticks the cursor at a point. If the point's position changes (new value or scrolling) the cursor will move with the point.
Events
LV_EVENT_VALUE_CHANGEDSent when a new point is clicked pressed.lv_chart_get_pressed_point(chart)returns the zero-based index of the pressed point.LV_EVENT_DRAW_PART_BEGINandLV_EVENT_DRAW_PART_ENDare sent with the following types:LV_CHART_DRAW_PART_DIV_LINE_INITUsed before/after drawn the div lines to add masks to any extra drawings. The following fields are set:part:LV_PART_MAINline_dsc
LV_CHART_DRAW_PART_DIV_LINE_HOR,LV_CHART_DRAW_PART_DIV_LINE_VERUsed for each horizontal and vertical division lines.part:LV_PART_MAINid: index of the linep1,p2: points of the lineline_dsc
LV_CHART_DRAW_PART_LINE_AND_POINTUsed on line and scatter charts for lines and points.part:LV_PART_ITEMSid: index of the pointvalue: value ofidth pointp1,p2: points of the linedraw_area: area of the pointline_dscrect_dscsub_part_ptr: pointer to the series
LV_CHART_DRAW_PART_BARUsed on bar charts for the rectangles.part:LV_PART_ITEMSid: index of the pointvalue: value ofidth pointdraw_area: area of the pointrect_dsc:sub_part_ptr: pointer to the series
LV_CHART_DRAW_PART_CURSORUsed on cursor lines and points.part:LV_PART_CURSORp1,p2: points of the lineline_dscrect_dscdraw_area: area of the points
LV_CHART_DRAW_PART_TICK_LABELUsed on tick lines and labels.part:LV_PART_TICKSid: axisvalue: value of the ticktext:valueconverted to decimal orNULLfor minor ticksline_dsc,label_dsc,
See the events of the Base object too.
Learn more about Events.
Keys
No Keys are processed by the object type.
Learn more about Keys.
Example
.. include:: ../../../examples/widgets/chart/index.rst
API
.. doxygenfile:: lv_chart.h
:project: lvgl