A bump chart is useful to see how value of a particular dimension changes with respect to other dimension over time. It more effective when the value being tracked or compared is Rank.

A bump chart is usually like a line chart, but when there are too many crossing its not so appealing. Hence the interest in curved Bump Chart. I have created the bump chart based on the works of  Rody Zachovich.(Difference is I used data densification method. )Check his blog here.

Lets Begin:

Download the data. Please note that this is made up data for illustration.

Import the data to Tableau public. Union the data with itself. –This is to create two distinct values for Path and create data densification. I referred to  article  by Toan Hoang for this.

• Create a calculated field Path

IF [Table Name]=’Sheet1′

THEN 1

ELSE 49

END

• Create Path (bin) with step size of 1 .   –This will give us 49 points so that we can draw our curve along those points
• Create calculated field [Index]

index()

• Create calculated field T and Sigmoid

[T]

([Index]-25)/4       –Index is calculated along Path (bin).Hence value of T will be from -6 to 6

[Sigmoid]

1/(1+EXP(-[T]))

Lets plot and see our progress

• Drag [Path (bin)] to rows. Check the show missing value option. Drag [Path (bin )] to Detail.
• Drag [T] to columns and [Sigmoid] to rows. Right click and set compute using to Path (bin) for [T] and [Path (bin)].

We have 49 points plotted against [T].

• Replace [T] with  [Index].

Drag [Year] to column and make it discreet.

For each [Year], we have [Index] and a sigmoid curve. Great..

• Change the Marks from Automatic to Line.

Add the  Rank for each [city]to the sigmoid curve.

• Create calculated field [Rank1]

WINDOW_MAX(MAX([Rank]))

• Create calculated field [Curve]

[Rank1]+[Sigmoid]

• Replace[Sigmoid] in Rows with [Curve].In Nested calculation, make sure that compute using is set to Path (bin).

Drag [City] to detail.

We have the Rank for each City in a Year. Now all the curve are just going upward. We need the curve to end where the next Rank for the City starts.

So for a City we need to get the Rank in the consecutive Year.

• Create [Rank 2 Setup]

IF ([Index] = 49 and LOOKUP(min([Year]),1)=min([Year])+1)

THEN LOOKUP([Rank1],1)

END

–if index is 49 and the next [Year] in the row is the consecutive Year, We lookup the next Rank.

Lets check the Tabular data to see what is happening here. For [Rank 2 Setup] set compute using to [Year],[Path (bin)].

When Index is 49,  [Rank 2 Setup] has the value of next Rank.

• Populate this for all the above rows by creating [Rank2]

IF(ISNULL(WINDOW_MAX([Rank 2 Setup])))

THEN [Rank1]

ELSE

WINDOW_MAX([Rank 2 Setup])

END

For [Rank2] set compute using to [Path (bin)].

• Modify [Curve] to

[Rank1]+([Rank2]-[Rank1])*[Sigmoid]

• Check each of the nested calculation and Set Compute Using as specified above.
• Edit the [Curve] axis and reverse the Scale.

Now for the Circle on the chart

• Create [Rank_DualAxis]

IF [Path]=1

THEN [Rank]

END

• Drag [Rank_DualAxis] to Rows. Make it Dual axis. Synchronize the axis. Adjust the mark size.

There is a gap between the line and circle. Edit the axis for [Index] to fix this.

Hide the headers and after some formatting , the final result.