This page aims to explain the basic tricks allowing to realize a lollipop plot with matplotlib.
Here is a first example with 2 numerical variables, one for each axis.
A lollipop plot can be created 1: using the stem() function or 2: using the vline() function. The 3 methods proposed below create the same output!
# library import matplotlib.pyplot as plt import numpy as np # create data x=range(1,41) values=np.random.uniform(size=40) # stem function: first way plt.stem(x, values) plt.ylim(0, 1.2) #plt.show() # stem function: If no X provided, a sequence of numbers is created by python: plt.stem(values) #plt.show() # stem function: second way (markerline, stemlines, baseline) = plt.stem(x, values) plt.setp(baseline, visible=False) #plt.show()
Then, a lollipop plot works as well if you have one numerical and one categorical variable. In this case it is closer from a barplot. I highly recommend to order your groups, and I personally prefer to display this vertically. The stem function does not allow to make it vertically, so you will have to use the hline and the plot functions as follow.
- #180 Ordered lollipop plot
- #180 Vertical and ordered lollipop
# Create a dataframe import pandas as pd df = pd.DataFrame({'group':list(map(chr, range(65, 85))), 'values':np.random.uniform(size=20) }) # Reorder it following the values: ordered_df = df.sort_values(by='values') my_range=range(1,len(df.index)+1) # Make the plot plt.stem(ordered_df['values']) plt.xticks( my_range, ordered_df['group']) # Vertical version. plt.hlines(y=my_range, xmin=0, xmax=ordered_df['values'], color='skyblue') plt.plot(ordered_df['values'], my_range, "D") plt.yticks(my_range, ordered_df['group']) plt.show()
Don’t forget that you can easily improve the quality of your chart, simply loading the seaborn library before calling your matplotlib chart!
import seaborn as sns plt.hlines(y=my_range, xmin=0, xmax=ordered_df['values'], color='skyblue') plt.plot(ordered_df['values'], my_range, "D") plt.yticks(my_range, ordered_df['group'])
Awesome post!