Skip to main content

webliveplot

Python Web served line plots with updates dynamically displayed.

This provides two classes:

Plot - which creates charts that can be updated with (time.time(), value) pairs.

Page - which generates a web server, displaying one or more Plot objects.

An example browser image with a single plot is:

Terminal screenshot

webliveplot can be installed from Pypi into a virtual environment, which will automatically pull in dependencies.

Example scripts are available on the github page. If you use UV, these can be copied locally and "uv run example1.py" will load dependencies and run it.

A typical script could be something like:

import asyncio, time, random

from webliveplot import Page, Plot

async def measurements(page):
    "Create data for each plot every ten seconds"
    while True:
        for plot in page:
            value = random.uniform(30, 70)  # random values used here
            # set a new description before putpoint, as putpoint generates a new chart
            plot.description = f"Latest value = {value:.1f}"
            plot.putpoint(time.time(), value)
        # and update the web page after changes
        page.update()
        await asyncio.sleep(10) # pause 10 seconds between updates

async def runcharts(page):
    """Create tasks, one runs the web server, at the given host and port
                     one runs 'measurements' gathering data for the plots
    """
    async with asyncio.TaskGroup() as tg:
        tg.create_task( page.serve(host='localhost', port=8000) )
        tg.create_task( measurements(page) )
        print("Now serving at localhost:8000")

# Create Plot objects
plot1 =  Plot(hours=1, title="Plot 1")
plot1.set_y_axis(ymin=0.0, ymax=80.0, yintervals=4, yformat=".1f")

plot2 =  Plot(hours=4, title="Plot 2")
plot2.set_y_axis(ymin=0.0, ymax=80.0, yintervals=4, yformat=".1f")
plot2.set_colors(backcol="yellow", gridcol="white",
                 axiscol="blue", chartbackcol="grey")

# insert plots into the page 
page = Page([plot1, plot2])
page.title = "Page title"

# Run the loop and serve the web page
asyncio.run(runcharts(page))

Details of the Plot class are:

Plot(hours=4, height=600, width=800, title="", description="")

hours is the hours, between 1 and 48, displayed along the x axis.

height is the height of the image.

width is the width of the image.

title, if given is a string shown above the line plot.

description, if given, is a string shown below the plot.

These values are also attributes, and if changed will be created when the next point is added with putpoint.

Methods

putpoint(t, v, lineindex=0)

Call this to add a point to the graph.

t must be a time.time() point, that is, a float which is seconds since January 1st 1970.

v is the value to be plotted.

lineindex is used if further lines are included in the plot. The single default line is lineindex 0.

The following methods, if called, will take affect on the next chart update when putpoint is called.

set_colors(backcol, gridcol, axiscol, chartbackcol)

If called sets chart colours. These arguments are also attributes of the plot and can be set individually.

backcol is default "white", The background colour of the whole image

gridcol is default "grey", The colour of the chart grid

axiscol is default "black", The colour of axis, title and description

chartbackcol is default "white", The background colour of the chart

All these colour names are SVG names and can be set as:

Color Names: "red", "blue" etc.

Hex Codes: "#FF0000" for red.

RGB/RGBA: "rgb(255,0,0)" or "rgba(255,0,0,0.5)" (with opacity).

HSL/HSLA: "hsl(0,100%,50%)" or "hsla(0,100%,50%,0.5)" (hue, saturation, lightness, alpha)

set_y_axis(ymin, ymax, yintervals, yformat)

Sets the y axis minimum and maximum values.

If this is not called, an automatic y scaling will be used.

If it is called, then these values will be set, however if any y point exceeds these values, then the chart will revert to auto-scaling.

If you wish to purposely revert to auto-scaling, call this with None values.

yintervals sets the grid and number of intervals up the y axis.

yformat is a string which defines how the y axis numbers are displayed. So the string ".2f" will show numbers with two decimal places.

The auto-scaling feature will inspect the line points, and attempt to set all these values automatically.

add_line(color="blue", label="")

As default the plot is created with one line, this method adds further lines. If label is set, a string of text of the same color as the line, will be shown on the right of the chart.

set_line(color="blue", label="", lineindex=0)

The color and label of a line can be set with this method.

lineindex is 0 for the initial default line, and increases to 1, 2, 3 ,.. etc for further lines if added using add_line.

set_localtime(tflag)

If tflag is True, (the default) the time values on the x axis will show local time (local time of the server).

If tflag is False, the time values will be UTC.

Details of the Page class are:

Page([plots])

The argument is either one Plot object or a list of Plot objects.

A Page acts as a list of plots, it has list indexing with methods append and insert and can be iterated over.

It has attribute 'title' which sets the web page title.

It has further methods:

serve(basepath=None, host='localhost', port=8000)

(async method) Await this to serve the web page.

basepath is either None, or a string such as '/graph/' which will set a path segment which will be prepended to the URL path.

host is a string, set it to '0.0.0.0' if you want to serve it external to localhost.

port is an integer

update()

This requests any connected browser to refresh the charts, and should be called after any page putpoint's are called. If not called, an automatic update will occur every thirty seconds.

The web page

The web page is produced via Mako templates beneath webliveplot/web/templates and is generated with the litestar framework, using htmx, and served with uvicorn.

https://www.makotemplates.org/

https://litestar.dev/

https://htmx.org/

https://uvicorn.dev/

The plots are generated using

https://github.com/bernie-skipole/minilineplot

The site CSS files are under webliveplot/web/static, and consist of normalize.css and sakura.css to provide a very minimalist classless CSS layout.

https://github.com/necolas/normalize.css/

https://github.com/oxalorg/sakura

The plots are simply displayed one below the other. To change the layout, try altering the template webliveplot/web/templates/charts.html, and your own CSS links could be placed in webliveplot/web/templates/chartpage.html.

All dependencies, htmx javascript and CSS files have their own licence requirements available via the above links, the remaining code is public domain as far as I'm concerned, feel free to use it as you wish.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

webliveplot-0.1.tar.gz (32.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

webliveplot-0.1-py3-none-any.whl (33.1 kB view details)

Uploaded Python 3

File details

Details for the file webliveplot-0.1.tar.gz.

File metadata

  • Download URL: webliveplot-0.1.tar.gz
  • Upload date:
  • Size: 32.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.5

File hashes

Hashes for webliveplot-0.1.tar.gz
Algorithm Hash digest
SHA256 00fa657b7ebdafef6f635c0ee7a2087b01923ebdbf68adc1755414401d97a8d1
MD5 9d90733620327456d36b0cd8fb2d1c6a
BLAKE2b-256 e3a8b47ad43ea33dfa62cdd61e5ec1c36bb386c0c0811e2fbddd3677565e479f

See more details on using hashes here.

File details

Details for the file webliveplot-0.1-py3-none-any.whl.

File metadata

  • Download URL: webliveplot-0.1-py3-none-any.whl
  • Upload date:
  • Size: 33.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.5

File hashes

Hashes for webliveplot-0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 18917c57e8f29596743f3e6a0ef657e717741f0f43eca976a15518c2d0315b59
MD5 2ce8b730e395fb1cccdc926fb47c7898
BLAKE2b-256 aeae79a26b46ef39f0d5b7071f7bf1fa2c3d8f2bf87208e3050571a6b6a99432

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page