Matplotlib picks limits for you. Override them when a chart should start at zero, or when tick labels need city names.
Goal
Set xlim / ylim, replace ticks, and turn the grid on.
Start at zero
cities = ["Nairobi", "Mombasa", "Kisumu"]
totals = [21, 15, 15]
fig, ax = plt.subplots()
ax.bar(cities, totals)
ax.set_ylim(0, 30)
ax.set_ylabel("units")
ax.set_title("ylim starts at 0")
plt.show()A bar chart that does not start at zero exaggerates differences.
Custom ticks
x = np.linspace(0, 2 * np.pi, 80)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x))
ax.set_xticks([0, np.pi / 2, np.pi, 3 * np.pi / 2, 2 * np.pi])
ax.set_xticklabels(["0", "π/2", "π", "3π/2", "2π"])
ax.set_title("Custom x ticks")
plt.show()Grid
months = ["Jan", "Feb", "Mar", "Apr"]
nairobi = [50, 40, 80, 150]
fig, ax = plt.subplots()
ax.plot(months, nairobi, marker="o")
ax.grid(True, axis="y", linestyle=":")
ax.set_ylabel("mm")
ax.set_title("Horizontal grid")
plt.show()axis="y" keeps vertical category lines off a bar or line chart of months.
Pitfall
ax.set_xticks(cities) fails — ticks want positions (numbers). Pass np.arange(len(cities)) then set_xticklabels(cities), or set_xticks(positions, labels=cities).