根据不同子图的y轴更新matplotlib子图的x轴

时间:2015-01-30 15:23:09

标签: python matplotlib plot projection subplot

我想绘制像这样的正交投影:

orthogonal projection

使用matplotlib,可能包括3D子图。所有子图都应该共享公共轴。

fig = plt.figure()
ax = fig.add_subplot(221, title="XZ")
bx = fig.add_subplot(222, title="YZ", sharey=ax)
cx = fig.add_subplot(223, title="XY", sharex=ax, sharey=[something like bx.Xaxis])
dx = fig.add_subplot(224, title="XYZ", projection="3d", sharex=ax, sharey=bx, sharez=[something like bx.Yaxis]

我无法弄清楚如何" link"一个图的x轴与另一个图的y轴。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:0)

晚会但是......

您应该能够通过使用其他子图轴数据手动更新一个子图的轴数据来完成您想要的任务。

例如,使用帖子中的记谱法,您可以使用ylimcx的{​​{1}}值与xlim bx值相匹配和get方法。

set

同样,您可以在子图上匹配刻度标签和位置。

cx.set_ylim(bx.get_ylim())

您应该能够以这种方式从已经实例化的子图中动态定义任何和所有轴属性和对象。

答案 1 :(得分:0)

我通过利用事件处理程序解决了 1 问题。 倾听"*lim_changed"个事件,然后正确地get_*limset*_lim来同步限制就可以了。 请注意,您还必须在右上图YZ中反转x轴。

这是一个同步x轴和y轴的示例函数:

def sync_x_with_y(self, axis):
    # check whether the axes orientation is not coherent
    if (axis.get_ylim()[0] > axis.get_ylim()[1]) != (self.get_xlim()[0] > self.get_xlim()[1]):
        self.set_xlim(axis.get_ylim()[::-1], emit=False)
    else:
        self.set_xlim(axis.get_ylim(), emit=False)

我实现了一个简单的类Orthogonal Projection,可以很容易地创建这样的图。

1 从一年前Benjamin Root在matplotlib邮件列表上给我的提示开始...抱歉没有在之前发布解决方案

答案 2 :(得分:0)

这是我解决问题的方法,它基本上是@elebards答案的精简版本。我只是将更新限制方法添加到轴类,因此他们可以访问set_xlim / set_ylim方法。然后我将这些函数连接到我想要同步它的轴的回调。当这些被调用时,将填充事件参数

import types
import matplotlib.pyplot as plt

def sync_y_with_x(self, event):
    self.set_xlim(event.get_ylim(), emit=False)

def sync_x_with_y(self, event):
    self.set_ylim(event.get_xlim(), emit=False)

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

ax1.update_xlim = types.MethodType(sync_y_with_x, ax1)
ax2.update_ylim = types.MethodType(sync_x_with_y, ax2)

ax1.callbacks.connect("ylim_changed", ax2.update_ylim)
ax2.callbacks.connect("xlim_changed", ax1.update_xlim)