Question: I am trying to reproduce this:  using this code: import matplotlib.pyplot as plt import numpy as np import pandas as pd from matplotlib.lines import Line2D colors = ["#CC5A43","#5375D4"]*3 data = { "year": [2004, 2022, 2004, 2022, 2004, 2022], "countries" : ["Sweden", "Sweden", "Denmark", "Denmark", "Norway", "Norway"], "sites": [13,15,4,10,5,8] } df= pd.DataFrame(data) df['pct_change'] = df.groupby('countries', sort=True)['sites'].apply( lambda x: x.pct_change()).to_numpy()*-1 df['ctry_code'] = df.countries.astype(str).str[:2].astype(str).str.upper() df = df.sort_values(['countries','year'], ascending=True ).reset_index(drop=True) df['diff'] = df.groupby(['countries'])['sites'].diff() df['diff'].fillna(df.sites, inplace=True) countries = df.countries.unique() code = df.ctry_code.unique() pct_change = df.pct_change x_coord = df.groupby('countries')['diff'].apply(lambda x: x.values) #convert the columns into numpy 2D array fig, ax = plt.subplots(figsize=(6,5), facecolor = "#FFFFFF") import matplotlib.cm # use a colormap cmap = plt.cm.RdBu for i, (color, x_c, country) in enumerate(zip(colors,x_coord, countries)): ax.broken_barh([x_c], (i-0.2,0.4),facecolors=cmap(0.7),alpha= 0.2) ax.scatter( df.sites, df.countries, marker="D", s=300, color = colors) ax.set(xlim=[0, 16], ylim=[-1, 3]) ax.xaxis.set_ticks(np.arange(0,20,5),labels = [0,5,10,15]) ax.tick_params(axis="x", which="major",length=0,labelsize=14,colors= '#C8C9C9') # Major ticks every 20, minor ticks every 5 major_ticks = np.arange(0, 16, 1) ax.set_xticks(major_ticks) ax.grid(which='major', axis='x', linestyle='-', alpha=0.4, color = "#C8C9C9") ax.set_axisbelow(True) plt.yticks([]) plt.box(False) #add legend labels = ['2004','2022'] colors = ["#5375D4","#CC5A43",] lines = [Line2D([0], [0], color=c, marker='D',linestyle='', markersize=12,) for c in colors] leg = ax.get_legend() plt.figlegend( lines,labels, labelcolor="#C8C9C9", bbox_to_anchor=(0.3, -0.1), loc="lower center", ncols = 2,frameon=False, fontsize= 12)  Which produces this:  My question is, how do i do the gradient on the broken_barh plots? I have tried to do a cmap on facecolors, but no luck. I have also tried using ax.barh and ax.plot but still stuck :(

Answer: Refer to the answer of How to fill matplotlib bars with a gradient? I have made some changes of the function gradientbars in which I add some comments. Also I have changed the size of the scatter plot for making it consistent with broken_barh and also for the legend which is disappeared. Here are the full codes: import matplotlib.pyplot as plt import numpy as np import pandas as pd from matplotlib.lines import Line2D from matplotlib.colors import LinearSegmentedColormap def gradientbars(bars, ax): colors = [(1, 0, 0), (0, 0, 1), ] # first color is red, last is blue cm = LinearSegmentedColormap.from_list( "Custom", colors, N=256) # Conver to color map mat = np.indices((10,10))[1] # define a matrix for imshow lim = ax.get_xlim()+ax.get_ylim() for bar in bars: bar.set_zorder(1) bar.set_facecolor("none") # get the coordinates of the rectangle x_all = bar.get_paths()[0].vertices[:, 0] y_all = bar.get_paths()[0].vertices[:, 1] # Get the first coordinate (lower left corner) x,y = x_all[0], y_all[0] # Get the height and width of the rectangle h, w = max(y_all) - min(y_all), max(x_all) - min(x_all) # Show the colormap ax.imshow(mat, extent=[x,x+w,y,y+h], aspect="auto", zorder=0, cmap=cm, alpha=0.2) ax.axis(lim) colors = ["#CC5A43","#5375D4"]*3 data = { "year": [2004, 2022, 2004, 2022, 2004, 2022], "countries" : ["Sweden", "Sweden", "Denmark", "Denmark", "Norway", "Norway"], "sites": [13,15,4,10,5,8] } df= pd.DataFrame(data) df['pct_change'] = df.groupby('countries', sort=True)['sites'].apply( lambda x: x.pct_change()).to_numpy()*-1 df['ctry_code'] = df.countries.astype(str).str[:2].astype(str).str.upper() df = df.sort_values(['countries','year'], ascending=True ).reset_index(drop=True) df['diff'] = df.groupby(['countries'])['sites'].diff() df['diff'].fillna(df.sites, inplace=True) countries = df.countries.unique() code = df.ctry_code.unique() pct_change = df.pct_change x_coord = df.groupby('countries')['diff'].apply(lambda x: x.values) #convert the columns into numpy 2D array fig, ax = plt.subplots(figsize=(6,5), facecolor = "#FFFFFF") # use a colormap cmap = plt.cm.RdBu bars = [] for i, (color, x_c, country) in enumerate(zip(colors,x_coord, countries)): bar = ax.broken_barh([x_c], (i-0.2,0.4),facecolors=cmap(0.7),alpha= 0.2) bars.append(bar) gradientbars(bars, ax) ax.scatter( df.sites, df.countries, marker="D", s=3000, color = colors) ax.set(xlim=[0, 16], ylim=[-1, 3]) ax.xaxis.set_ticks(np.arange(0,20,5),labels = [0,5,10,15]) ax.tick_params(axis="x", which="major",length=0,labelsize=14,colors= '#C8C9C9') # Major ticks every 20, minor ticks every 5 major_ticks = np.arange(0, 16, 1) ax.set_xticks(major_ticks) ax.grid(which='major', axis='x', linestyle='-', alpha=0.4, color = "#C8C9C9") ax.set_axisbelow(True) plt.yticks([]) plt.box(False) labels = ['2004','2022'] colors = ["#5375D4","#CC5A43",] lines = [Line2D([0], [0], color=c, marker='D',linestyle='', markersize=25,) for c in colors] leg = ax.get_legend() plt.figlegend( lines,labels, labelcolor="#C8C9C9", bbox_to_anchor=(0.3, 0.00), loc="lower center", ncols = 2,frameon=False, fontsize= 25)  Which gives you the result: