FlowPath by Friven

User guide

Getting started

You need somewhere for each flow to start and somewhere for it to end. Everything else, including Origin Thickness, is optional.

FieldWhat it does
Origin Latitude
Origin Longitude
Where each flow starts. Numeric.
Destination Latitude
Destination Longitude
Where it ends. Numeric.
Origin Location
Destination Location
Place names instead of coordinates — see below. Use these or the latitude/longitude pairs.
Origin ThicknessOptional. The measure driving how thick each arrow is drawn; without it every arrow is the same weight.
Destination ThicknessOptional, licensed. What the flow is worth when it arrives, so the arrow can narrow or widen along its length — see Divergent path widths.

Add Origin and Destination as text fields to get place names in tooltips and for screen readers; without them the visual falls back to showing raw coordinates. Add Legend to color flows by category, and Tooltips for any extra fields you want on hover.

Rows sharing an origin, destination and legend category are combined into one arrow, with their values summed.

Flows that share a route but not a category — the same lane served by both air and ocean, say — are separate arrows, and are automatically fanned apart so each one is visible. Without that they would be drawn on identical pixels and all but one would be hidden. Nothing to turn on; a lane with only one flow is unaffected.

Using place names instead of coordinates

If you don't have latitude and longitude, bind Origin Location and Destination Location instead. Each takes a single column in this format:

City|State|Country
FieldRule
CityRequired.
StateThe state, province or region. Leave it empty for countries that have none — the two separators are still required.
CountryRequired. An ISO 3166-1 alpha-3 code: USA, NLD, KOR, DEU.
Denver|CO|USA
Rotterdam||NLD
London|ON|CAN
Seoul||KOR

Separate the fields with a pipe (|). Spaces around the separators don't matter, and neither does capitalization.

Latitude and longitude always win. If a row has both coordinates and a location, the coordinates are used. You can mix the two in one dataset — the location column fills in only the rows where coordinates are missing.

Whole countries and regions

Leave the city empty to draw a flow at country level — useful for trade between nations rather than between sites:

||AUS      the whole of Australia
|NSW|AUS   just New South Wales
|CO|USA    just Colorado

These land on the same spot the map already labels that country or state at, and the tooltip marks them as a country or area rather than a city.

If your state or province isn't recognized

The reference data holds one administrative level per country, and it isn't always the one you have. Belgium is stored by region (Flanders, Wallonia) rather than by province, so Herstal|Liege|BEL names a real province that simply isn't in the data.

Rather than dropping the row, the visual ignores the part it can't use and matches on city and country alone — but only when that gives exactly one answer. The tooltip then shows what was actually matched, so Herstal|Liege|BEL reads back as Herstal, Wallonia, BE. A state that is recognized but wrong still fails: Denver|TX|USA is refused, because Denver is not in Texas.

When rows don't appear

A note at the bottom of the visual reports how many rows could not be located. Hover it to see why. Three usual causes:

For the second case there is a switch on the Locations card, Approximate unknown cities. With it on, a city that isn't in the reference data is drawn at the center of its state or province instead of being left out, and the tooltip says so. It needs a state to work — there is nothing to approximate to without one.

It is off by default deliberately. An arrow to the middle of Pennsylvania looks exactly as precise as an arrow to a real town, and only the tooltip distinguishes them. Turn it on when an approximate picture beats a mostly empty one, and say so when you share the report.

Other forms we accept but don't support

For convenience the visual also understands commas instead of pipes, alpha-2 country codes (US), full country names (United States), and spelled-out states (Colorado).

These are a courtesy, not a contract. They are not guaranteed to keep working between versions, and we can't treat a problem with them as a defect. Commas are the riskiest, because several official country names contain one — Korea, Republic of is four comma-separated fields, not three. If you are building something that has to keep working, use pipes and alpha-3 codes.

Arrows

Three styles, on the Arrows card:

StyleShapeHow direction reads
Directional (default)Constant-width shaft ending in an arrowheadThe arrowhead
TaperFull width at the origin, narrowing toward the destinationThe taper itself
LineConstant width end to endNo direction cue

Also here: color, minimum and maximum thickness in pixels, opacity, and curve intensity. Curve intensity is what separates an A-to-B flow from its B-to-A counterpart — at zero they lie on top of each other. Flows running the same way between the same two places are fanned apart automatically and stay separated whatever this is set to.

Bubbles

Markers at each end. Origins and destinations get their own color, shape and size — circle, square, star, pin or teardrop.

Combine shared locations is on by default and matters more than it sounds. A hub is usually both an origin and a destination, and drawing it as two circles on identical coordinates is indistinguishable from one circle — hiding the fact that it is a hub. Combined, such a place renders as a single marker split into wedges: origin color for outbound, destination color for inbound, sized by its total throughput.

Bind Origin Size or Destination Size to size markers from data. The size control then becomes the maximum radius and a minimum appears; markers scale on a square-root scale, so area rather than radius tracks the measure.

Basemap and labels

Land, country borders, US state borders, US county borders (off by default — three thousand polygons is a lot of ink), oceans and lakes, each with their own colors.

Center longitude picks the meridian in the middle of the world, which is the same as choosing where the map is cut. Leave it at 0 for a Greenwich-centered map; set 180 for a Pacific-centered one.

Country, US state and city labels are each independently switchable, with their own text size, bold, italic and underline. Density controls how much clearance each label claims: zoomed out, a crowded region only has room for its most significant names; zoom in and more fit.

Zooming

Scroll to zoom, drag to pan. Arrows and markers hold a constant size on screen as you zoom, so zooming genuinely pulls a crowded region apart instead of magnifying the crowding. Zoom and pan are both bounded by the map, so you cannot shrink it into a corner or drag off into empty space.

Licensed features

A single license unlocks all of the following. They render in full so you can evaluate them; a watermark appears if you publish a report using them without a license.

Great circle paths

On the Arrows card, set Path to Great circle for true shortest-distance routes, including flows crossing the antimeridian.

They curve, and the curve is real. A great circle is the shortest route across a sphere, and a flat map cannot show that as a straight line. Every path bends toward the nearer pole — north of the equator it bows north, south of it, south. That is why a flight from New York to Tokyo passes near the Arctic rather than straight across the Pacific.

The curve can look as though it always leans the same way, but that depends on which direction you are traveling, not on the map. Heading east in the northern hemisphere, north is to your left and the arc appears counterclockwise; heading west, north is to your right and the same arc appears clockwise. A dataset made mostly of eastbound northern routes will look consistently one-handed for that reason alone.

Two things worth knowing if a path looks wrong. A due north–south route draws perfectly straight, because a meridian already is a great circle. And the bend grows with distance: barely visible across a few hundred miles, unmistakable across an ocean. If you would rather flows read as simple curves between points, use Arc mode instead — it looks tidier, but the line it draws is not the route anything actually takes.

Multi-hop routes

Bind Route ID and rows sharing a value chain into one continuous arrow through its waypoints. One row per leg:

RouteIDLegOriginDestinationArrowThickness
R-1001ChicagoDenver500
R-1002DenverSeattle500
R-1003SeattleTokyo500

Leg Order sequences the hops so the table need not be sorted. A route's thickness is the largest value across its legs, not the sum — the rows above describe one shipment of 500, not 1,500. Waypoints render as combined markers automatically.

The automatic fan described above works leg by leg, not route by route. If R-100's first hop, Chicago to Denver, happens to match a plain flow somewhere else in your data, that one leg is fanned apart from it — the rest of the route is unaffected, and stays on the curve you set.

Flow animation

Dots traveling along each flow, showing direction as motion. Speed is in screen pixels per second, so the pace holds steady as you zoom. Honors the system reduced-motion setting: the dots are placed once and left still.

Timeline playback

Bind Start Time and a play/pause strip appears below the map.

Bind the date field itself, not its date hierarchy. Power BI expands dates to a Year/Quarter/Month/Day hierarchy by default; use the dropdown on the field well to pick the field name instead, or turn off Auto date/time for the file. The visual copes with either, but the plain date gives cleaner step labels.

Step by chooses the grain — Auto, Day, Week, Month, Quarter or Year. The steps are a generated calendar across your data's range, not just the dates that happen to appear in it, so you can animate a whole year from a handful of records.

Bind End Time and a flow stays on screen for its whole span rather than flashing on for one step — so a contract starting in May and ending in September appears and disappears on the right days.

Show picks the reading: Instant shows what is active at each step; Cumulative builds up everything that has started so far, with arrows thickening as they accumulate.

Switching the timeline off shows the whole period at once, with values summed.

Divergent path widths

Bind Destination Thickness as well as Origin Thickness and each arrow is drawn between its two values — narrowing where a flow loses something on the way, widening where it gains. Shrinkage, spoilage, consumption and packet loss all read directly off the shape.

The tooltip carries the exact figures: the arrival value, named after whichever measure you bound, and the change as a percentage. Worth relying on, because line width is a coarse channel. A 40% loss is obvious at a glance; a 3% one is not, and no formatting will make it so. The taper tells you which lanes to look at, and the tooltip tells you by how much.

Bound data overrides the Style setting: a flow carrying a real decay tapers even in Line style, and its taper reflects the measure rather than the cosmetic Taper option. In Directional style the arrowhead scales to the arriving width.

Leave it unbound, or bind it to the same measure as Origin Thickness, and arrows keep one width end to end — no watermark, because that is exactly what an unlicensed report draws.

Coloring by value change

Width alone only tells you which lanes to look at. To read the rate of loss, set Color by to Value change on the Arrows card. Each flow is then drawn as a gradient: healthy at the origin, shifting toward the loss color by however much it gives up on the way. A flow that loses nothing stays one flat color, so only the leaks draw the eye.

Full loss color at (% retained) sets where the scale bottoms out — at the default of 50%, a lane arriving with half what it left with is fully saturated. Lower it if your losses are smaller than that and everything looks healthy; a network whose worst lane leaks 8% needs a floor near 90% before the scale says anything.

This replaces category color, it does not add to it. Color can carry one variable, so switching to Value change means your Legend categories stop being distinguishable by color — the legend still lists them, but the arrows no longer match it. Worth it while hunting for leaks; switch back afterwards.

Three scales. Green to red is the default because it is the convention everyone already reads — green unchanged, red losing, blue gaining. It is also the one pair that red-green color blindness cannot separate, which is why Blue to orange sits beside it: blue unchanged, orange losing, purple gaining, legible to everyone. Custom takes all three colors from you.

The scale runs in both directions from the middle. A flow arriving with what it left with is the healthy color; one that loses moves toward the loss color, one that gains moves toward a third. Gains saturate at the same magnitude losses do, so with the floor at 50%, losing half and gaining half sit equally far from the middle.

The gradient follows the straight line between the two ends rather than the curve itself, so at high curve intensity a color sits slightly ahead of where its value really is along the path.

Directional highlighting

Turn on Split inbound and outbound on select on the Arrows card, then click a bubble. That location’s outbound flows stay solid, its inbound flows become dashed outlines, and everything else fades well back.

Direction is carried by shape rather than color, which is the point: on a busy hub, arrowheads all land within a few pixels of each other and overlap into noise. A solid/dashed split stays readable at any density, and survives color-blindness and monochrome printing.

The split is specifically what clicking a bubble does. Clicking an arrow dims as it always did — there is no location for a single flow to be inbound or outbound of — and clicking a legend entry cross-filters that whole category, which is a set of flows rather than a place.

More than 20 flows

A flow is one lane or one route. A four-leg route counts once, and a lane recorded monthly counts once — the limit measures the picture, not the row count of your model.

Over the limit the map still draws. It shows the twenty largest flows and says so in the corner — Showing 20 of 87 flows — rather than refusing, or covering everything in a watermark. The largest are chosen so what you see is the significant part of the network rather than whichever lanes happened to come first, and the same lanes stay chosen between refreshes. Hover the note for the exact figures.

This is the one licensed feature that does not watermark. The rest render in full and are marked; this one renders in part and is captioned.

Notes and limits

Sample report

A ready-made report is available if you would rather see the fields bound than read about them: download the sample .pbix. It contains its own data, so it opens and renders without a connection to anything.

Data attribution

Place-name lookup uses data from GeoNames, used under CC BY 4.0.

Map geography comes from Natural Earth and the US Census Bureau, both public domain. All of it is bundled with the visual and read locally.