kaminsknator
kaminsknator

Reputation: 1183

Share y axes for subplots that are dynamically created

Working example

import matplotlib.pyplot as plt
names = ['one','two','three']
upper = [[79,85,88],[79,85,88],[79,85,88]]
lower = [[73,72,66],[73,72,66],[73,72,66]]
fig = plt.figure(1)
for idx,lane in enumerate(names):
    ax = fig.add_subplot(1,len(names)+1,idx+1)
    ax.plot(upper[idx], color='tab:blue', marker='x', linestyle="None")
    ax.plot(lower[idx], color='tab:blue', marker='x', linestyle="None")
    ax.set_title(lane)
plt.show()

This generates 3 plots dynamically. It works I could very well not be using the best practices for dynamically generating plots. The goal is to have all the plots generated share the Y-axis so that it will give it a cleaner look. All the examples I've looked up show that you can assign the shared axis to the previously used axis but in my case all the plots are created dynamically. Is there a way to just lump all the subplots in a figure into sharing the same y axis?

Upvotes: 1

Views: 1156

Answers (1)

asdf101
asdf101

Reputation: 669

The common approach to creating a figure with multiple axes is plt.subplots, which accepts a sharey = True argument.


Example:

import numpy as np
import matplotlib.pyplot as plt

xdata = np.linspace(0, 10, 100)
ydata_1 = np.sin(xdata)
ydata_2 = np.cos(xdata)

fig, (ax1, ax2) = plt.subplots(1, 2, sharey = True, figsize = (8, 4))
ax1.plot(xdata, ydata_1)
ax2.plot(xdata, ydata_2)

This outputs:

shared y axis plots

For less space between the plots, you can also use a tight_layout = True argument.


Using your data, you could maybe rewrite it to something like

fig, axes = plt.subplots(1, len(names), sharey = True, tight_layout = True)

for idx, (ax, name) in enumerate(zip(axes, names)):
    ax.plot(upper[idx], color='tab:blue', marker='x', linestyle="None")
    ax.plot(lower[idx], color='tab:blue', marker='x', linestyle="None")
    ax.set_title(name)

plt.show()

Upvotes: 1

Related Questions