Considera los siguientes datos a modo de ejemplo:
# Datos
age_groups = ["0-9", "10-19", "20-29", "30-39", "40-49", "50-59", "60-69", "70+"]
male = [12, 14, 16, 15, 13, 10, 7, 4]
female = [11, 13, 15, 16, 14, 11, 8, 6]
Una pirámide de población son dos gráficos de barras horizontales espalda con espalda que comparten el mismo eje de categorías, usados normalmente para comparar dos grupos (como población masculina y femenina) por franjas de edad. Matplotlib no tiene una función específica: dibuja el primer grupo con barh como de costumbre y el segundo con sus valores en negativo, para que las barras crezcan en la dirección contraria.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.barh(age_groups, male)
ax.barh(age_groups, [-f for f in female])
# plt.show()

Colores y leyenda
Fija color y label para cada lado, y luego llama a ax.legend como de costumbre.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.barh(age_groups, male, color = "#4C72B0", label = "Hombres")
ax.barh(age_groups, [-f for f in female], color = "#C44E52", label = "Mujeres")
ax.legend()
# plt.show()

Como el lado izquierdo usa valores negativos, las etiquetas del eje por defecto mostrarán números negativos. Arréglalo con un formateador personalizado que muestre el valor absoluto.
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.barh(age_groups, male, color = "#4C72B0", label = "Hombres")
ax.barh(age_groups, [-f for f in female], color = "#C44E52", label = "Mujeres")
ax.legend()
ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f"{abs(int(x))}"))
# plt.show()

Grosor de las barras
Controla el grosor de las barras igual que en un gráfico de barras normal, con el argumento height.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.barh(age_groups, male, height = 0.6, color = "#4C72B0", label = "Hombres")
ax.barh(age_groups, [-f for f in female], height = 0.6, color = "#C44E52", label = "Mujeres")
ax.legend()
# plt.show()

También te puede interesar