How to plot a linear profile trend with numbers


With the flow I shared, I want to draw a linear profile that creates a trend similar to the temperature curves in the picture with the data I receive from different pixels of the thermal camera via serial port. Regards

[
    {
        "id": "ea87b1398b776bca",
        "type": "tab",
        "label": "Flow 1",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "4da371155c78d245",
        "type": "serial-port",
        "serialport": "/dev/ttyUSB0",
        "serialbaud": "19200",
        "databits": "8",
        "parity": "none",
        "stopbits": "1",
        "waitfor": "",
        "dtr": "none",
        "rts": "none",
        "cts": "none",
        "dsr": "none",
        "newline": "\\n",
        "bin": "false",
        "out": "char",
        "addchar": "",
        "responsetimeout": "1000"
    },
    {
        "id": "c8facfc96a336368",
        "type": "ui_base",
        "theme": {
            "name": "theme-light",
            "lightTheme": {
                "default": "#0094CE",
                "baseColor": "#0094CE",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
                "edited": true,
                "reset": false
            },
            "darkTheme": {
                "default": "#097479",
                "baseColor": "#097479",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
                "edited": false
            },
            "customTheme": {
                "name": "Untitled Theme 1",
                "default": "#4B7930",
                "baseColor": "#4B7930",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"
            },
            "themeState": {
                "base-color": {
                    "default": "#0094CE",
                    "value": "#0094CE",
                    "edited": false
                },
                "page-titlebar-backgroundColor": {
                    "value": "#0094CE",
                    "edited": false
                },
                "page-backgroundColor": {
                    "value": "#fafafa",
                    "edited": false
                },
                "page-sidebar-backgroundColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "group-textColor": {
                    "value": "#1bbfff",
                    "edited": false
                },
                "group-borderColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "group-backgroundColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "widget-textColor": {
                    "value": "#111111",
                    "edited": false
                },
                "widget-backgroundColor": {
                    "value": "#0094ce",
                    "edited": false
                },
                "widget-borderColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "base-font": {
                    "value": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"
                }
            },
            "angularTheme": {
                "primary": "indigo",
                "accents": "blue",
                "warn": "red",
                "background": "grey",
                "palette": "light"
            }
        },
        "site": {
            "name": "Node-RED Dashboard",
            "hideToolbar": "false",
            "allowSwipe": "false",
            "lockMenu": "false",
            "allowTempTheme": "true",
            "dateFormat": "DD/MM/YYYY",
            "sizes": {
                "sx": 48,
                "sy": 48,
                "gx": 6,
                "gy": 6,
                "cx": 6,
                "cy": 6,
                "px": 0,
                "py": 0
            }
        }
    },
    {
        "id": "c07241771bed7c5b",
        "type": "inject",
        "z": "ea87b1398b776bca",
        "name": "READ TEMP OF 80,60",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "?Pix(80,60)",
        "payloadType": "str",
        "x": 160,
        "y": 220,
        "wires": [
            [
                "de0fe2ae5da53fc0"
            ]
        ]
    },
    {
        "id": "2eeda06607062417",
        "type": "comment",
        "z": "ea87b1398b776bca",
        "name": "SERIAL READ COMMAND",
        "info": "",
        "x": 190,
        "y": 40,
        "wires": []
    },
    {
        "id": "de0fe2ae5da53fc0",
        "type": "function",
        "z": "ea87b1398b776bca",
        "name": "CARRIAGE RETURN (CR/LF)",
        "func": "msg.payload = msg.payload+\"\\r\\n\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 430,
        "y": 220,
        "wires": [
            [
                "b18e7fa0b073ca92"
            ]
        ]
    },
    {
        "id": "b18e7fa0b073ca92",
        "type": "serial request",
        "z": "ea87b1398b776bca",
        "name": "",
        "serial": "4da371155c78d245",
        "x": 670,
        "y": 220,
        "wires": [
            [
                "b799d6aebefe62c0"
            ]
        ]
    },
    {
        "id": "d03852053ca0ac6d",
        "type": "debug",
        "z": "ea87b1398b776bca",
        "name": "TEMP1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1180,
        "y": 220,
        "wires": []
    },
    {
        "id": "0e2242699e637cd0",
        "type": "inject",
        "z": "ea87b1398b776bca",
        "name": "ImgTemp",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "!ImgTemp",
        "payloadType": "str",
        "x": 160,
        "y": 100,
        "wires": [
            [
                "eec8d05cf27a45cb"
            ]
        ]
    },
    {
        "id": "945830e45564bf55",
        "type": "inject",
        "z": "ea87b1398b776bca",
        "name": "READ TEMP OF 80,80",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "?Pix(80,80)",
        "payloadType": "str",
        "x": 160,
        "y": 300,
        "wires": [
            [
                "e7ed7db9e3f0755d"
            ]
        ]
    },
    {
        "id": "29d1fd345bdcae43",
        "type": "debug",
        "z": "ea87b1398b776bca",
        "name": "TEMP 2",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1140,
        "y": 300,
        "wires": []
    },
    {
        "id": "e7ed7db9e3f0755d",
        "type": "function",
        "z": "ea87b1398b776bca",
        "name": "CARRIAGE RETURN (CR/LF)",
        "func": "msg.payload = msg.payload+\"\\r\\n\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 490,
        "y": 300,
        "wires": [
            [
                "33847b4324c2da55"
            ]
        ]
    },
    {
        "id": "33847b4324c2da55",
        "type": "serial request",
        "z": "ea87b1398b776bca",
        "name": "",
        "serial": "4da371155c78d245",
        "x": 730,
        "y": 300,
        "wires": [
            [
                "2ed01d733b629592"
            ]
        ]
    },
    {
        "id": "7637f66a56ac445e",
        "type": "serial request",
        "z": "ea87b1398b776bca",
        "name": "",
        "serial": "4da371155c78d245",
        "x": 790,
        "y": 100,
        "wires": [
            [
                "31c7a59362f2c84e"
            ]
        ]
    },
    {
        "id": "eec8d05cf27a45cb",
        "type": "function",
        "z": "ea87b1398b776bca",
        "name": "CARRIAGE RETURN (CR/LF)",
        "func": "msg.payload = msg.payload+\"\\r\\n\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 530,
        "y": 100,
        "wires": [
            [
                "7637f66a56ac445e"
            ]
        ]
    },
    {
        "id": "31c7a59362f2c84e",
        "type": "debug",
        "z": "ea87b1398b776bca",
        "name": "debug 2",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1080,
        "y": 100,
        "wires": []
    },
    {
        "id": "2ed01d733b629592",
        "type": "function",
        "z": "ea87b1398b776bca",
        "name": "Parse and trim",
        "func": "let pay = msg.payload.split(\"!Pix(80,80)=\");\nmsg.payload = {[pay[0]] : parseFloat(pay[1].trim())};\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 940,
        "y": 300,
        "wires": [
            [
                "29d1fd345bdcae43"
            ]
        ]
    },
    {
        "id": "a1fb6cbabed18349",
        "type": "json",
        "z": "ea87b1398b776bca",
        "name": "",
        "property": "payload",
        "action": "obj",
        "pretty": false,
        "x": 1030,
        "y": 220,
        "wires": [
            [
                "d03852053ca0ac6d"
            ]
        ]
    },
    {
        "id": "b799d6aebefe62c0",
        "type": "function",
        "z": "ea87b1398b776bca",
        "name": "Parse and trim",
        "func": "let pay = msg.payload.split(\"!Pix(80,60)=\");\nmsg.payload = {[pay[0]] : parseFloat(pay[1].trim())};\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 860,
        "y": 220,
        "wires": [
            [
                "a1fb6cbabed18349"
            ]
        ]
    }
]