For those wanting to add manual legend items into a single/common legend with automatically generated items:
#Imports
import matplotlib.patches as mpatches
# where some data has already been plotted to ax
handles, labels = ax.get_legend_handles_labels()
# manually define a new patch
patch = mpatches.Patch(color='grey', label='Manual Label')
# handles is a list, so append manual patch
handles.append(patch)
# plot the legend
plt.legend(handles=handles, loc='upper center')
Example of common legend with manual and auto-generated items:

ADDED 2021-05-23 (amended 2023-04-21 to include points)
complete example with manual line, patch, and points
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import matplotlib.patches as mpatches
# from data
plt.plot([1,2,3,4], [10,20,30,40], label='My Data (line)', color='red')
plt.scatter([2.5], [15], label='My Data (scatter point)', color='b') # plotting single point via scatter
plt.plot([3.5], [20], label= ' My Data (plot point)', marker='o', markersize=10,
markeredgecolor='k', markerfacecolor='g', linestyle='') # plotting single point via plot with null linestyle
# access legend objects automatically created from data
handles, labels = plt.gca().get_legend_handles_labels()
# create manual symbols for legend
patch = mpatches.Patch(color='grey', label='manual patch')
line = Line2D([0], [0], label='manual line', color='k')
point = Line2D([0], [0], label='manual point', marker='s', markersize=10,
markeredgecolor='r', markerfacecolor='k', linestyle='')
# add manual symbols to auto legend
handles.extend([patch, line, point])
plt.legend(handles=handles)
plt.show()
