Psychrochart Versions Save

A Python 3 library to make psychrometric charts and overlay information on them.

v0.11.1

1 month ago
Changes from #60
  • ๐ŸŽจ lint: pre-commit autoupdate + typing fixes
  • ๐Ÿ› Fix label color for chart zones
  • ๐Ÿš€ Bump patch version and update CHANGELOG

v0.11.0

1 month ago
Changes (from #59)
  • โšก๏ธ Use simple 1D interpolator to project lines, instead of scipy.interpolate.interp1d
  • โœ… Add tests for convex hulls of given points
  • โšก๏ธ Use simple convex hull algorithm, to compute zones to group annotated points, instead of using scipy.spatial.ConvexHull
  • ๐Ÿ“ฆ๏ธ Bump version, removing scipy dependency

v0.10.0

1 month ago

Move to recent versions of pydantic, and also upgrade internal linters, moving to ruff-format

Changes
  • ๐Ÿ“ฆ๏ธ env: Bump version and upgrade deps, requiring pydantic v2
  • โ™ป๏ธ Migrate pydantic v2 syntax for validators, parsers, serializers, model load/dump methods, etc.
  • ๐ŸŽจ lint: pre-commit update, moving to ruff-format
  • ๐ŸŽจ lint: Apply format changes and lint fixes
  • ๐Ÿ“ Update CHANGELOG
  • ๐Ÿ‘ท ci: Split actions for tests on PRs and publish package on main

v0.9.3

7 months ago

From @tadashiorigami in #44, thanks!

Changes
  • โœจ Add styling for annotations (labeled curves in the chart), customizing their font-size, color, and bbox style.
  • ๐Ÿ”ง Support negative constant_h_labels_loc settings, to strech the constant h line to the left inside the saturated area, giving the chart an aspect closer to the popular ASHRAE chart.
  • โœ… Add unit test with example from @tadashiorigami, with styled annotations with bbox and hack for negative constant_h_labels_loc
  • ๐Ÿ“ฆ๏ธ Bump version and update matplotlib to 3.8.0

v0.9.2

9 months ago

Changes

  • ๐ŸŽจ lint: pre-commit autoupdate
  • ๐Ÿ“ฆ๏ธ env: Bump patch version and fix deps with pydantic version < v2, and enabling new Python 3.12
  • ๐Ÿ“ Update CHANGELOG

v0.9.1

11 months ago

Changes

  • โœจ Add new kind of overlay zone 'dbt-wmax', to define chart areas delimited between db-temps and absolute humidity values, solving #28
  • ๐Ÿ› Enable zones defined by 2 points (assume a rectangle defined by left-bottom/right-top coords)
  • ๐Ÿ› Fix logic for plot regeneration, to plot again if config changes AFTER plotting the chart
  • ๐Ÿ› Fix ZoneStyle definition when linewidth is 0 and linestyle remains the default (passing inconsistent params to matplotlib)

v0.9.0

11 months ago

Define new kinds of enclosed areas in chart, between constant RH lines and constant volume or enthalpy values (zone_kind: "volume-rh"/"enthalpy-rh"), and enable full potencial for SVG customization by including CSS and/or <defs> inside it.

Changes

  • โœจ Add new kind of overlay zones 'enthalpy-rh' and 'volume-rh', to define chart areas delimited between 2 constant enthalpy or volume lines, and 2 constant humidity lines
  • ๐ŸŽจ Add chart.remove_zones() method, like the existent .remove_legend() and .remove_annotations(), to clear matplotlib current Axes from each kind of annotated objects
  • ๐Ÿ› Fix artists registry not mirroring objects in plot, by setting a new one each time chart.plot() is invoked
  • โ™ป๏ธ Set gid for 'chart_legend_background' item if frameon is enabled
  • โœจ Pass optional CSS and SVG to chart.make_svg(), to include extra-styling inside the produced SVG ๐ŸŒˆ
  • โœจ Add method chart.plot_over_saturated_zone() to create a filled patch in the over-saturated zone of the psychrochart, to colorize that area
  • ๐Ÿฆ„ tests: Add dynamic effects and CSS rules to splash chart for a show of SVG styling capabilities

v0.8.0

11 months ago

Now all chart-data parameters, including the overlayed zones, are included in the ChartConfig, and curve-generation only happens when chart is plotted (or saved to disk, or if chart.process_chart() is invoked ๐Ÿ˜œ).

Any change in the chart configuration will trigger a data-regen for all items before plotting.

When plotting over some matplotlib Axes, all objects created now have meaningful (and deterministic) ids, and are tracked and accessible under chart.artists, for easier customization of single matplotlib objects, also adding a recognizable hierarchy in generated SVGs, (enabling potential for CSS over SVG charts ๐ŸŒˆ)

Changes

  • โœจ Name each matplotlib Artist obj in plot with custom readable IDs, for easier recognition and readable object hierarchy in SVGs, and maintain a registry of all objects in plot to access them by kind under chart.artists property, allowing fine-grain control to customize all details in the psychrochart
  • โ™ป๏ธ Refactor chart 'zones' and store zone definitions in ChartConfig, to regenerate plot patches (closed PsychroCurve, with ZoneStyle) on-demand, same as the other chart curves, generating new 'xy' points when config is changed. If ChartParams.with_zones is enabled, but there are no zones in config when chart is created, the default winter/summer 'dbt-rh' zones are added.
  • โšก๏ธ Add lazy generation of psychro curves to avoid updating the chart data until it's needed to plot, and add a chart.process_chart() method to trigger data regeneration if the chart config has changed or there is no chart data yet
  • ๐Ÿ’ฅ Make chart.saturation a single PsychroCurve, instead of a collection of curves
  • โœ… tests: Add unit tests for new ChartRegistry and adapt to behaviour changes and readable hierarchy in SVG output
  • ๐Ÿ“ Update example notebook showing chart.artists usage
  • ๐Ÿš€ env: Update deps, bump version, and update CHANGELOG

v0.7.0

11 months ago

Before, chart customization was done by creating a new Psychrochart object based on some modified chart configuration, so creating custom plots, or even changing chart limits, was challenging ๐Ÿ˜“

Now, when chart.config changes, any call to chart.save(), chart.make_svg(), or chart.plot() will regenerate the chart data (limits, enabled curves, styling, etc.) before plotting, with only the visible curves inside limits, (no more 0-size artifacts in SVGs, and most errors because some var is out of range should be gone now ๐Ÿคž)

Changes

  • โ™ป๏ธ Update example notebook with API changes, and using chart.make_svg() as the recommended method to generate SVGs
  • ๐Ÿ’„ Parse colors into RGBA values, so "red", "#FF0000", "#FF0000FF" produce the same float repr [1., 0., 0., 1.]
  • ๐Ÿ—๏ธ Add mutation control for configuration models, and use it to check if there is any config change before creating a chart, triggering a chart-data regeneration if necessary
  • ๐Ÿ”ง Add new field ChartFigure.dpi to chart config, for easy customization of matplotlib Figure DPI
  • โšก๏ธ Optimize generation of psychrometric curves inside plot limits
  • ๐Ÿ› Fix convergence and var-out-of-range errors
  • ๐Ÿ’ฅ Remove plotting methods from PsychroCurve/PsychroCurves for a more functional approach, using methods in plot_logic.py
  • ๐Ÿ’ฅ Add PsychroCurve.internal_value field, to identify the trigger value for each curve (constant H/V/RH...), and evolve validation of data arrays
  • โœ… tests: Increase test coverage and optimize tests for faster run (~2x)
  • ๐Ÿ“ฆ๏ธ env: Add slugify to deps and bump version

v0.5.0

11 months ago

๐Ÿงน Internal evolution to update the code style to the latest versions and de facto standards, with better typing, input validation, and serialization. Hardly any new features (.make_svg()), but some bug fixes.

BREAKING-CHANGE: Now the chart creation from a configuration key/file/dict is done with PsychroChart.create(config), instead of old PsychroChart(config)

Changes

  • ๐Ÿ—๏ธ Add pydantic models for chart + annotations styling and config, for better (de)serialization and parameter validation.

    New models are:

    • CurveStyle, LabelStyle, TickStyle, ZoneStyle := to parse & handle defaults for matplotlib styling parameters
    • ChartConfig for the full chart configuration, including sub-models ChartFigure, ChartLimits, and ChartParams, to mirror the old obfuscated config, with the same default values as before
    • ChartPoint and ChartSeries for styled single-point or array-data annotations
    • ChartLine for styled connectors between named points (now without outline 'marker' by default)
    • ChartArea for styled convex areas delimited by a list of named points
    • ChartAnnots as container for all of the above
    • ChartZone (and ChartZones as a list), for styled fixed areas (like the default winter/summer comfort zones)
  • โ™ป๏ธ Evolve load methods to parse inputs into pydantic models with near-zero (expected ๐Ÿคž) breaks when reading old data

  • ๐Ÿ’ฅ Rework PsychroChart class to work with pydantic PsychroChartModel. As the chart is now a pydantic model, there is a chart.json(...) method, and loading from serialized data is available with PsychroChart.parse_file( / .validate( / etc ๐Ÿคฉ

  • โœจ Add .make_svg() method to produce a SVG file as text, and evolve .save(...) with optional canvas_cls: Type[FigureCanvasBase], to select kind of matplotlib canvas where to print the chart

  • โœจ Support file creation in subfolders with chart.save(dest)

  • ๐Ÿšš rsc: Deterministic SVG output in tests, and README images without date metadata

  • โœ… tests: Adapt API changes in unit tests, remove usages of unittest.TestCase, add new tests for pydantic models, annotations, and serialization methods.