我有一系列子图,我希望它们在2个子图中共享x和y轴(按行)。
我知道可以单独创建所有子图,然后再创建add the sharex
/sharey
functionality afterward。
但是,鉴于我必须对大多数子图执行此操作,因此这是很多代码。
一种更有效的方法是创建具有所需sharex
/ sharey
属性的所有子图,例如:
import matplotlib.pyplot as plt
fix, axs = plt.subplots(2, 10, sharex='row', sharey='row', squeeze=False)
,然后设置{em> unset sharex
/ sharey
功能,假设地的工作方式如下:
axs[0, 9].sharex = False
axs[1, 9].sharey = False
上面的方法不起作用,但是有什么方法可以做到这一点?
答案 0 :(得分:3)
您可以使用ax.get_shared_x_axes()
获取包含所有链接轴的Grouper对象。然后使用group.remove(ax)
从该组中删除指定的轴。您也可以group.join(ax1, ax2)
添加新共享。
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(2, 10, sharex='row', sharey='row', squeeze=False)
data = np.random.rand(20, 2, 10)
for row in [0,1]:
for col in range(10):
n = col*(row+1)
ax[row, col].plot(data[n,0], data[n,1], '.')
a19 = ax[1,9]
shax = a19.get_shared_x_axes()
shay = a19.get_shared_y_axes()
shax.remove(a19)
shay.remove(a19)
a19.clear()
d19 = data[-1] * 5
a19.plot(d19[0], d19[1], 'r.')
plt.show(fig)
答案 1 :(得分:1)
您可以使用ax.get_shared_x_axes()
或通过属性ax._shared_y_axes
访问共享轴组。然后,您可以使用xaxis.set_tick_params(which='both', labelleft=True)
或setp(ax, get_xticklabels(), visible=True)
重置标签的可见性,但是这两种方法都存在相同的先天问题:刻度格式器仍在轴之间共享。据我所知,这是没有办法的。这是一个示例来演示:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
fig, axs = plt.subplots(2, 2, sharex='row', sharey='row', squeeze=False)
axs[0][0]._shared_x_axes.remove(axs[0][0])
axs[0][0]._shared_y_axes.remove(axs[0][0])
for ii in range(2):
for jj in range(2):
axs[ii][jj].plot(np.random.randn(100), np.linspace(0,ii+jj+1, 100))
axs[0][1].yaxis.set_tick_params(which='both', labelleft=True)
axs[0][1].set_yticks(np.linspace(0,2,7))
plt.show()
答案 2 :(得分:1)
正如@zan在their answer中指出的那样,您可以使用ax.get_shared_x_axes()
获取包含所有链接轴的Grouper
对象,然后.remove
从这个石斑鱼。问题是(如@WMiller所指出的),所有轴的股票报价仍然相同。
因此需要
完整示例
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()
请注意,在上文中,我仅更改了x轴的行情指示器,也仅更改了主要行情。如果需要,您需要对y轴和较小的刻度进行相同的操作。