I have a series of subplots, and I want them to share x and y axis in all but 2 subplots (on a per-row basis).
I know that it is possible to create all subplots separately and then add the sharex
/sharey
functionality afterward.
However, this is a lot of code, given that I have to do this for most subplots.
A more efficient way would be to create all subplots with the desired sharex
/sharey
properties, e.g.:
import matplotlib.pyplot as plt
fix, axs = plt.subplots(2, 10, sharex='row', sharey='row', squeeze=False)
and then set unset the sharex
/sharey
functionality, which could hypothetically work like:
axs[0, 9].sharex = False
axs[1, 9].sharey = False
The above does not work, but is there any way to obtain this?
As @zan points out in the their answer, you can use ax.get_shared_x_axes()
to obtain a Grouper
object that contains all the linked axes, and then .remove
any axes from this Grouper. The problem is (as @WMiller points out) that the ticker is still the same for all axes.
So one will need to
Complete example
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(3, 4, sharex='row', sharey='row', squeeze=False)
data = np.random.rand(20, 2, 10)
for ax in axes.flatten()[:-1]:
ax.plot(*np.random.randn(2,10), marker="o", ls="")
# Now remove axes[1,5] from the grouper for xaxis
axes[2,3].get_shared_x_axes().remove(axes[2,3])
# Create and assign new ticker
xticker = matplotlib.axis.Ticker()
axes[2,3].xaxis.major = xticker
# The new ticker needs new locator and formatters
xloc = matplotlib.ticker.AutoLocator()
xfmt = matplotlib.ticker.ScalarFormatter()
axes[2,3].xaxis.set_major_locator(xloc)
axes[2,3].xaxis.set_major_formatter(xfmt)
# Now plot to the "ungrouped" axes
axes[2,3].plot(np.random.randn(10)*100+100, np.linspace(-3,3,10),
marker="o", ls="", color="red")
plt.show()
Note that in the above I only changed the ticker for the x axis and also only for the major ticks. You would need to do the same for the y axis and also for minor ticks in case it's needed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With