Gallery¶
This gallery shows the chart types and features of IronLAB. Every image in it is rendered by IronLAB's own renderer, the same pipeline that draws the interactive viewer, and no other plotting or rasterising tool is involved. Every entry page shows its figure live, drawn in the browser by that same engine, with the image and the PDF as the fallback for a browser that cannot draw it; shows the exact code that produced the figure; and offers the figure as the PDF that IronLAB exports for inclusion in a publication. The figures that plot gridded or scattered data use the functions on the data helpers page.
A damped oscillation plotted as lines with markers at the samples, a dashed line without markers and a dotted envelope. Series with labels appear in the legend, and the axis labels are typeset with LaTeX.
Points of a sunflower spiral drawn as filled markers, each coloured by the value of the Julia field at its position and sized by its distance from the centre.
The flight of a baseball struck at 40 m/s and 35° above the horizontal, in a vacuum and through still air, each line coloured along its length by the speed of the ball. In a vacuum the ball slows to 33 m/s at the top of its flight and lands as fast as it was struck; through air, drag slows it to 22 m/s near the top, it lands at 25 m/s, and its range is shorter by almost two fifths. The colour data holds one value per point, so each segment is drawn as a gradient between the speeds at its ends, and both trajectories share the default colour scale of the axes, which the horizontal colourbar in the fitted row beneath the axes shows.
Data decimation for very large datasets
Both panels plot the same hundred-thousand-sample vibration record. The upper (over its whole time extent) is decimated (points and lines are collapsed where they overlap) for quick rendering and compact export, while retaining significant features in the data. When zoomed in, as in the lower panel, data is rendered in full. The two panels share one stored copy of the record.
Power laws on log-log axes, the magnitude response of a low-pass filter on a logarithmic frequency axis, and exponential decays on a logarithmic vertical axis.
The frequency response of a driven, damped oscillator, whose title, axis labels and legend use LaTeX fractions, square roots, Greek letters, subscripts and units.
Four partial sums of the Fourier series of a square wave, named with LaTeX in the legend. In the viewer, click a legend entry to hide or show its series; a hidden series is greyed in the legend and is left out of an exported PDF.
Three days of synthetic hourly readings from five weather stations, with one legend panel, titled "Key", in the sixth tile. Every station plots its air temperature and dew point, and the three coastal stations also plot the sea surface temperature. Entries with the same display name and the same look are listed once, so the panel holds three entries for thirteen series; in the viewer, clicking an entry hides that series in every axes.
The step response and the magnitude response of a second-order system for twelve damping ratios, with one legend panel spanning the full width of the figure below both plots. The panel arranges its twelve entries in as few columns as fit its height, and the rows of tiles are weighted 3 : 1 so that the panel is a third as tall as the plots above it.
The lift, drag and pitching-moment coefficients of a synthetic aerofoil polar at a base case and at six levels of an input perturbation, in a stack of three plots that share the angle of attack. The base case is drawn last, so that the family never hides it, but the key beneath the plots lists it first, on a row of its own, followed by the perturbation levels in columns. The key sits in a row fitted to its entries, so it neither clips them nor takes more height than they need.
The displacement thickness of the boundary layer on a symmetric aerofoil section at two angles of attack, drawn as offsets from the surface, with markers at the points of transition and separation on each surface. The curve key on the left lists the curves. The marker key on the right explains the markers once, with items that stand for no plot: a grey shape for each kind of point, and a colour swatch for each surface, however many markers are drawn. Both keys sit in a row fitted to the taller of them.
A synthetic hill drawn as a surface coloured by its elevation, with the survey points measured on it drawn as markers of two kinds, points measured by GNSS and points measured by total station, and the features of the site: a road over the southern foot coloured by its gradient, a footpath to the summit, the benchmarks of the survey and the trig pillar on the summit. Two boxed legend panels, each headed by its title, are stacked beside the plot in rows fitted to them. The first keys the survey in one column: the two kinds of marker as ordinary entries, then the colour scale of the surface as a bar item, a vertical colourbar seven rows long centred on the column of samples. The second keys the site in two columns: the bar of the road's gradient, five rows long, in the first, and the four features in the second.
A synthetic polar sweep of an aerofoil computed by a reference code and by a candidate code, compared quantity by quantity over the angle of attack, which every panel shares. Dotted reference lines span the axes at a tolerance on a logarithmic axis and at the ends and middle of an interval; orange ticks along the top of each panel mark the angles at which the candidate's value is not a number. The ticks are placed at the data angle and at 98.5 % of the panel height, may overhang the top edge but are clipped to the angles in view, and take no part in the limits, so they stay on the edge while the reader pans and zooms. The legend of the lift panel explains the ticks once, with an item that stands for no plot. In the bottom right panel neither code converged at any angle, so the ticks are all there is.
Where boundary-layer transition falls within its station interval, on the upper and lower surface of twelve synthetic aerofoil test cases, one row per case. There is no categorical axis type: each row is an explicit y tick at its index, named by an explicit tick label, and the y axis is reversed so that the first case is at the top. Only the left panel names the rows; the right panel hides its tick labels, and the two plot areas are the same width because the layout shares the page between plot areas after the margins are taken out. The inviscid cases have no transition, so their rows are empty but kept. Dotted lines mark the ends and the middle of the interval, and the legend panel explains the marker styles once.
Pressure distribution on a reversed axis
The pressure coefficient and the surface speed of the potential flow around a Joukowski aerofoil at an angle of attack of 4°, computed exactly by conformal mapping. The pressure coefficient is plotted on a reversed y axis, as aerodynamicists draw it, so that suction (negative \(C_p\)) is upwards; the limits are still given lower bound first, and a datatip reports \(C_p\) as stored rather than its negation. The two panels share the chordwise axis through an x link, which shares limits only, so the speed below keeps its usual direction. Only the bottom panel labels its x ticks, and the plot areas keep the 3 : 2 ratio of the row weights all the same.
NACA 4-digit family sheet at equal aspect
The NACA 4-digit aerofoil sections, computed analytically, varied one parameter per panel about the default section NACA 4412: the maximum camber \(m\), the chordwise position \(p\) of the maximum camber and the thickness \(t\). Each panel is drawn at equal aspect, so that one unit of chord has the same length along x and y and a 12 % thick section looks 12 % thick; the aspect is kept by shrinking each plot area to the fixed limits, which every panel shares through x and y links, with the same regular ticks. The long panel titles are aligned with the left edge of each plot area. The five members of each panel are told apart by five dash patterns, the default section being the solid line.
Equal aspect kept by the box and by the limits
A unit circle and the square around it, drawn at equal aspect in two tiles of unequal weight. On the left the aspect is kept by the box: the manual limits are drawn exactly, and the plot area shrinks to their shape and is centred in its tile. On the right it is kept by the limits: the plot area fills its tile, and the manual x limits widen symmetrically about their centre. In both, the circle is round and the square is square, as they stay while the figure is panned and zoomed in the viewer.
Equal aspect in three dimensions
A unit sphere shown with limits of unequal span, x and z from −1 to 1 and y from −2.5 to 2.5. With an automatic aspect the box stays a cube, so the sphere is squashed along y; at equal aspect kept by the box, the limits are kept and the sides of the box take the lengths of the ranges, so that one unit has the same length along x, y and z and the sphere is round from every view, however the figure is rotated. The third panel draws a low hill at a ratio of z of 4, the vertical exaggeration of a terrain map, so that its box is four times as tall as the hill's height alone would make it.
An estimate of the minimum drag coefficient of three aerofoil sections at four Reynolds numbers, in drag counts of one ten-thousandth. Each section's drag is twice the skin friction of a flat plate, laminar over the fraction of the chord ahead of transition and turbulent behind it, multiplied by a form factor that grows with the thickness of the section. The laminar-flow section NACA 63-415 keeps a longer run of laminar flow, so it has the least drag at every Reynolds number. The bars are grouped by Reynolds number: the bars helper writes each section as an ordinary bar series in the next colour of the colour order, a third of the cluster wide and offset by whole widths from the centre of its category, and each series has its own legend entry. The categories are the positions 0 to 3, named by text tick labels.
Stacked, horizontal, floating and highlighted bars
Four ways of drawing bars, each in its own axes. The stacked bars are the annual heat balance of four zones of a building: the gains stack upwards from zero and the losses downwards, each part an ordinary bar series whose bases are the running totals of the parts before it, so that the heating each zone needs is what closes its balance and the two stacks of a zone are equally long. A legend panel under the axes, in a row fitted to its entries, keys the five parts. The horizontal bars give the mean downtime per failure of six subsystems of a wind turbine, laid flat so that their long names read level, with the first subsystem at the top. The floating bars show the range over which six substances are liquid at atmospheric pressure: each bar starts at the melting point, its base, and is as long as the difference between the boiling and melting points, its value. The last axes compares the specific strength of six structural materials, the tensile strength divided by the density, with per-bar colours that draw every bar grey except carbon-fibre composite. The names under both lower axes are turned by 30° so that they do not collide.
Stepped outlines of the two kinds that stairs draw. On the left, a converter samples an analogue signal 2 ms apart, quantises each sample to the nearest of the 0.25 V levels of a 4-bit digital-to-analogue converter, and holds it until the next sample, as a zero-order hold does: the held output is drawn as open stairs through values held at the samples, each from its own sample up to the next, over the signal it reconstructs. On the right, the octave-band sound pressure levels of a pump and of the background noise of the room it stands in, values held between the edges of the bands on a logarithmic frequency axis, as an analyser reports them. The pump's spectrum is filled down to its base of 0 dB; the background is drawn as stairs on the same base without a fill, so that both outlines drop to the base at their ends.
The diameters of 400 shafts turned on each of two lathes to a nominal 25 mm, drawn from seeded normal distributions: the first lathe is centred on the nominal diameter, and the second, whose tool has worn, cuts 12 µm oversize and spreads its parts more widely. On the left the two samples are binned on the same edges and normalised as probability densities, so that each outline encloses unit area however many shafts it counts, and drawn as step outlines, which overlay without hiding one another. Over each outline is the normal density with the mean and standard deviation of its sample. On the right the same samples are stacked as counts on the same edges, so that the top of each stack is the histogram of the whole production. Each histogram stores its binned values together with a record of how they were binned, so a datatip in the viewer reports the count and density of the bin under the pointer.
Two-dimensional histogram and density contour
The joint distribution of the streamwise and wall-normal velocity fluctuations u′ and v′ in the logarithmic region of a turbulent boundary layer, scaled by the friction velocity, as 20 000 seeded samples of a correlated normal distribution. The fluctuations are anticorrelated: fluid moving away from the wall is slower than the mean, and fluid moving towards it faster, which is the Reynolds shear stress −u′v′ that carries momentum to the wall. On the left the pairs are binned on a 40 × 40 grid and drawn as cells coloured by their count through a logarithmic colour scale; bins with no sample are left empty, because a logarithmic scale cannot place a count of zero. On the right the same samples are binned more coarsely and drawn as filled contours of their probability density, banded by a discrete colour scale whose lowest edge lies above zero and which draws nothing below it, so that the plane where no sample lies stays blank. Each scale is shown by a colourbar in the fitted column beside its axes, and both axes are drawn at equal aspect, so that the tilt of the distribution reads true.
Isolines of the Julia field at twelve automatically chosen levels, each coloured by its level through the colour scale of the axes.
Bands between explicitly chosen levels of the Julia field, filled with colours from the magma colormap.
The pressure coefficient of the potential flow past a circular cylinder, filled through a discrete colour scale of eight bands, half a unit of the coefficient wide, from −3 at the shoulders of the cylinder to 1 at its stagnation points. Neither the filled contour nor the black isolines over it has levels of its own: both take the band edges of the scale they name, so the bands and the isolines cannot disagree, and a value exactly on an edge belongs to the band above it. The colourbar in the fitted column beside the axes shows the same scale as eight blocks, one per band, with a tick at every edge.
Arrows showing the gradient of the Julia field on a coarse grid, drawn over isolines of the field on a fine grid. The arrows point uphill and cross the isolines at right angles.
A domain colouring of the third Julia iterate z₃, drawn as true-colour pixels whose hue follows the argument of z₃ and whose lightness follows its magnitude. The alpha channel of the pixels fades to transparent outside a disc, so the axes background shows through the corners of the image.
The Julia field drawn as a scalar image through a continuous colour scale with the magma colormap, beneath black isolines of the same field. The values inside a disc are set to NaN, and a colour scale draws nothing for a value that is not finite by default, so the axes background shows through the disc.
The Julia field quantised into eight classes and drawn twice as an indexed image: a scalar image through an indexed colour scale of the 256 colours of viridis, whose pixels name entries of the palette directly. On the left the classes are stored as bytes; on the right they are floating-point indices with a frame of pixels at index 300, beyond the last entry, which the scale's policy for values outside its entries draws in a fixed colour.
A synthetic 8-bit elevation raster of a mountainous coast, stored as one byte per pixel as many older terrain formats store it, and drawn through the 256-entry palette that travels with it. Codes 0 to 63 are water, 64 to 191 are land from sea level to the snow line at 2000 m, and 192 to 255 are ice, so each code is a step of about 16 m. The colourbar of an indexed scale draws one block per entry, so its 256 blocks are the palette itself, and its ticks sit at the centres of the entries they name: here three entries in the middle of the three ranges are labelled by name rather than by number.
One photograph drawn three times from the same pixels, in axes with the same limits, so that only the placement differs. With the default placement, row 0 of the pixels lies at y = 0, so a photograph, whose row 0 is its top, appears upside down. A descending row range places row 0 at the top and makes the photograph upright. Descending ranges for both the columns and the rows, each with its own pitch, mirror, stretch and shift the image in one step. The photograph is Plains zebra eye close-up in Etosha National Park by Giles Laurent, licensed under CC BY-SA 4.0. It was cropped to a square and downsampled to 256 × 256 pixels for this gallery.
The ground-level concentration of a pollutant downwind of a 60 m stack, from the Gaussian plume model with the Briggs dispersion coefficients of a neutral atmosphere. The concentration spans four decades over the plume, so the scalar image maps it through a colour scale with a logarithmic norm between 0.1 and 1000 µg/m³, which gives each decade an equal share of the colormap. The scale draws nothing for a concentration below 0.1 µg/m³, so the air the plume has not reached is left blank rather than painted in the first colour, and the black isolines mark the decades 0.1, 1, 10 and 100 µg/m³. The colourbar beside the axes is ticked at the decades, which are equally spaced along it, and its empty key below the bar stands for the concentrations below 0.1 µg/m³ that are left blank.
The elevation of the sea floor around a synthetic volcanic island, which rises from a continental slope falling from 200 m to 4000 m below sea level. The depths are drawn through the cividis colour scale from −4000 to 0 m, shown by a colourbar inside the plot area along its east edge, where the open ocean leaves room for it; the bar stands on a white box so that its ticks read over the field. Land lies above the range of the scale, so it is drawn in one brown, and the bar's key names it. The black line is the coastline.
The temperature of a thin aluminium plate at three times after a laser pulse heats a spot 2 mm wide at its centre by 400 K. Heat diffuses outward with the diffusivity of aluminium, so the spot widens and its peak falls as the energy spreads over a larger area. The three images name one colour scale, fixed from 20 to 100 °C, and one horizontal colourbar in a panel spanning the row beneath them shows it; the bar and its key together are half as long as the row of three plot boxes, centred beneath it, and the title of the scale lies along the bar, below its labels. The first frame is hotter than the top of the scale at its centre, so values above 100 °C are drawn in cyan rather than clipped to the last colour, and the key beside the bar says so.
Which equilibrium Newton's method finds for the imperfect pitchfork x³ − λx − ε = 0, started from x = 0.3, over a sweep of the load λ and the imperfection ε. Each cell is coloured by the branch the iteration converged to: the stable equilibrium with x > 0, the stable one with x < 0, the unstable one between them, or none within 40 iterations. The colours are a categorical colour scale. The sweep was run as batches of rows that stopped at different loads, and the cases that were never run are NaN: they are drawn as nothing and keyed by the scale's non-finite key, labelled "not run". Over the map are drawn the fold curve 4λ³ = 27ε², which bounds the region of three equilibria, its cusp at the origin, the line on which the starting point is itself a root, and the load at which each stopped batch ended. The key is one boxed legend panel under the plot in two columns, filled column by column: the scale listed as an item, which becomes one entry per category and its key, fills the first, and the four plotted features fill the second.
The number of iterations that a boundary-layer transition model took to converge in each case of a test matrix of Mach and Reynolds numbers, drawn through a discrete colour scale of five bands, so that each cell reads as a band of effort rather than an exact count. The scale is shown by a horizontal colourbar in a panel under the plot, whose non-finite key, labelled "not entered", keys the cases at low Reynolds number in which the flow stayed laminar and the model was never entered. Diamonds mark the cases compared with wind-tunnel measurements, and a legend inside the plot area lists them, over the corner of cases that the model never entered.
Branch coverage occupancy matrix
The branch coverage of a synthetic panel-method code, as a test campaign might report it: one row per subroutine, grouped under a bold header row for each source file, and one square cell per branch of the subroutine, coloured by its status. The rows are ragged, because each subroutine has as many cells as it has branches, from 2 to 40; occupancy pads the short rows with NaN, which the categorical scale draws as nothing, and hides the x axis, because the position of a branch within its row names nothing. ycategory_groups lays out the headers, the members and a blank row between the files, and CategoryRows::place puts the branches of each subroutine in its own row. The five statuses are the categories of a categorical colour scale, keyed by a legend panel under the plot in which the scale is listed as an item. The cells are drawn at equal aspect, so that they are square. In the viewer, a datatip names the subroutine, the branch and its status.
Case by subroutine coverage matrix
The fraction of the branches of each subroutine of a synthetic panel-method code that each test case takes, one column per case and one row per subroutine. The cases are named by their identifiers, set in monospace with \texttt and turned by 90° so that they stand clear of one another; the layout reserves the height they take, so none is clipped. The cells are drawn through a discrete colour scale of eight bands an eighth wide, shown by a horizontal colourbar in a panel under the plot, and they are square, because the axes is drawn at equal aspect. A subroutine that a case never entered has no fraction, so its value is NaN; the scale draws it in a neutral grey, and the colourbar's non-finite key, labelled "not entered", keys it. White dots mark the cells in which a case takes a branch that no other case takes, and a legend panel under the colourbar names them.
The speed of the potential flow past a circular cylinder, drawn as a surface in a two-dimensional axes on a polar mesh whose rings crowd towards the cylinder. A surface in a two-dimensional axes is seen from directly above, which makes it the pseudocolour plot of MATLAB's pcolor: the field values belong to the vertices of the mesh, so the mesh may be curvilinear, which the pixels of an image cannot be.
Spectrogram on a logarithmic frequency axis
The spectrogram of an exponential sine sweep from 20 Hz to 20 kHz played through a loudspeaker that adds harmonic distortion, as in an acoustic measurement. The sweep rises by the same number of decades every second, so on a logarithmic frequency axis it is a straight line, and its second, third and fourth harmonics are parallel lines above it. The power is drawn as a surface in a two-dimensional axes, whose nodes are placed through the logarithmic scale. An image could not be drawn here: a raster of evenly spaced pixels has no placement on a logarithmic axis, and validation refuses an image whose plane has one.
Measured speed faded by its confidence
The speed of the flow past a cylinder as a particle image velocimetry measurement might report it, with a validation confidence for every vector: low next to the wall, where reflections spoil the particle images, and lower still in the shadow that the cylinder casts in the laser sheet, which enters from above. On the left the confidence is the alpha of a colour-mapped image, so that each pixel fades as far as its vector is doubtful, and the inside of the cylinder, where nothing was measured, is transparent. On the right the same speed is a surface over its own contours: the confidence is the alpha of the faces, and a face opacity below one lets the contours on the floor show through the whole surface. Alpha has the shape of the data and varies over it; opacity is one number for the whole artist, which the viewer's property editor can change without regenerating any data.
The Julia field drawn as a surface whose faces are coloured by height and outlined with thin black edges. In the viewer, drag in rotate mode to change the azimuth and elevation of the view.
The Julia field drawn as a wireframe whose edges are coloured by height. The faces are filled with the background colour, so that they hide the parts of the mesh behind them.
Points of a sunflower spiral lifted to the height of the Julia field and coloured by that height, drawn as filled markers in three dimensions.
Isolines of the Julia field drawn in three dimensions, each at the height of its own level, so that they trace the shape of the surface.
Upward unit normals of the Julia field's surface, drawn as arrows from the nodes of a coarse grid over the surface itself.
The Julia field as a scalar image on the floor of a three-dimensional axes, beneath a surface of the same field. An image on a face of the axes box is painted behind everything that lies in front of that face, so the surface covers the image wherever the surface stands above it.
A three-dimensional cross-correlation volume, of the kind that locates a displacement in particle image velocimetry, drawn as colour-mapped images: one over the whole floor, and three quarter-size planes through the dominant peak at the centre, one in each coordinate plane at an explicit offset. Weaker noise peaks lie throughout the volume, several of them near the floor. An image lies in a plane of its axes at any offset, not only on the faces of the box. The three planes cross at the peak, and every backend draws each of them in front of the others exactly where it is nearer.
A saddle and an inclined plane that cut through each other, a helix threading through both, and scattered points on either side of the sheets. The viewer resolves every crossing with a depth buffer. No back-to-front order of these faces, segments and markers can draw the picture, so the exported PDF embeds the axes as an image and the export report says so.
Four independent axes in a two-by-two grid of tiles. Panning or zooming one of them in the viewer leaves the others unchanged.
Six axes with three groups of linked limits: the top row shares its y limits, the left column shares its x limits, and a diagonal pair shares its x limits. In the viewer, panning or zooming an axes moves every axes linked with it along that dimension.
A signal, its derivative and its running integral stacked in three rows whose x limits are all linked with a single call. Zooming into a time interval in any row zooms every row.
Temperature profiles against depth at three sites, side by side in axes whose y limits are all linked with a single call, so that equal depths stay level when any panel is panned or zoomed.