Matplotlib:如何让一个子图的 x 轴与另一个子图的 y 轴共享?

5
我想在交互式共享坐标轴的XY,XZ,YZ子图上投影3D数据。
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(3, 1, constrained_layout=True)

n = 10000
pts = {
   'X': np.random.normal(0, 1, n),
   'Y': np.random.normal(0, 2, n),
   'Z': np.random.normal(0, 4, n)
}

for ax, (k1, k2) in zip(axes, [('X', 'Y'), ('X', 'Z'), ('Y', 'Z')]):
   ax.plot(pts[k1], pts[k2], ',')
   ax.set_xlabel(k1)
   ax.set_ylabel(k2)

axes[0].sharex(axes[1])
axes[1].sharey(axes[2])

plt.show()

XY和XZ图共享X轴限制,YZ和XZ图共享Z轴限制,但如何使XY和YZ共享Y轴限制?也许可以使用类似axes[2].sharey(axes[0])的语法来实现吗?
1个回答

0
我发现一个快速(可能非常愚蠢)的解决方法是手动共享轴。换句话说,如果您想要共享的x和y轴在图中具有相同的大小(即它们都跨越例如10厘米),则可以手动设置它们具有相等的限制、刻度和刻度标签。在您的情况下,应该是这样的:
axes[0].set_ylim(axes[2].get_xlim()) #set the y lim of first subplot the same 
                                     #as x lim of last subplot      
axes[0].set_yticks(axes[2].get_xticks()) #set y ticks of first subplot the same as
                                         #x ticks of last subplot
#You can also do further stuff like turning off y ticks labels of axes[0] 
#with something like plt.setp(axes[0].get_yticklabels(), visible=False).

在我的情况下,在所有图形调整(subplots_adjust()等)之后进行此操作,产生的结果非常类似于共享这两个轴,同时具有正确的刻度标签。在手动“共享”之后调整axes[0]的y刻度标签似乎更棘手,因为axes[2].get_xticklabels()返回一个Text对象数组,这些对象还具有x和y位置。另一个(不太简洁的)解决方法是手动调整axes[0]的y刻度标签:
#list comprehension to get strings of each x ticks of last subplot
ax2xticklabels = [i.get_text() for i in axes[2].get_xticklabels()] 
axes[0].set_yticklabels(ax2xticklabels) #set y tick labels of first subplot
                                        #the same as x tick labels of last subplot

我来这里的目的是寻找一种更优雅的解决方法,但是注意到在互联网上似乎没有独立共享2个轴对象的内容,所以我想分享我的临时解决方案:D。希望这能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接