matplotlib 将一个或两个轴居中,使“视图”围绕特定地块居中

xienkqul  于 2023-06-06  发布在  其他
关注(0)|答案(3)|浏览(140)

假设**点(10,50)**将我的二维坐标系划分为四个部分:

  • 左上方,右上方
  • 左下,右下

这个点是固定的,我事先知道它的位置。
任务:始终将此点保持在matplotlib显示的坐标系的中间。
当然,我可以实现这一点,例如设置

axs.set_xlim(0, 20)
axs.set_ylim(0, 100)

这完美地将所提到的点集中在图的中间。这种方法的问题是,我事先不知道我的动态散射数据,我也想在这个图中可视化。
有时候可能是

x_data = (2, 5, 15)
y_data = (25, 30, 75)

这将适用于我之前设置的xlimylim,但有时数据可能是:

x_data = (-10, 0, 20)
y_data = (-2, 101, 205)

此数据不会显示,因为它在集合xlimylim之外。

**问题:**我是否可以保持默认的轴动态扩展,以便包括我的数据的每个点,并且仍然以某种方式将该点置于图形的“中间”?

不同的措辞:我可以指定一个轴的中心而不指定它的最小值和最大值,并仍然保持自动缩放,以便包括“每个点”的散射?

hyrbngr7

hyrbngr71#

我会使用类似的东西(对于x轴):

if x_data:
    left_span, right_span = center_x - min(x_data), max(x_data) - center_x
    half_x_span = max(left_span, right_span)
    if half_x_span > 0:
        axs.set_xlim(center_x - half_x_span, center_x + half_x_span)
khbbv19g

khbbv19g2#

Smin                       Smax
  |---+---------------|----------+-------|
 C-L                 C                  C+L

从上一个图中,我们有

C+L ≥ Smax ⇒ L ≥ Smax-C
Smin ≥ C-L ⇒ L ≥ C-Smin

最后

L = max(Smax-C, C-Smin)

翻译成Matplotlib的上下文

def limits(c, mnmx):
    mn, mx = mnmx
    L = max(mx-c, c-mn)
    return(c-L, c+L)

xc, yc = 10, 50
# plot your data
ax.set_xlim(limits(xc, ax.get_xlim())
ax.set_ylim(limits(yc, ax.get_ylim())

下面是一个例子

In [22]: import matplotlib.pyplot as plt

In [23]: def limits(c, mnmx):
    ...:     mn, mx = mnmx
    ...:     L = max(mx-c, c-mn)
    ...:     return (c-L, c+L)

In [24]: def plot_example (ax, xmn_xmx):
    ...:     y = [50, 50]
    ...:     ax.scatter(xmn_xmx, y)
    ...:     ax.scatter(10, 50)
    ...:     ax.set_xlim(limits(10, ax.get_xlim()))

In [25]: fig, axes = plt.subplots(3, figsize=(6, 6), layout='constrained')
    ...: for ax, xmn_xmx in zip(axes, ((-3, -2), (12, 15), (-20, 100))):
    ...:     plot_example(ax, xmn_xmx)
    ...: plt.show()
5uzkadbs

5uzkadbs3#

来自一个OP的评论
我的问题更多:“我可以在不指定xlim和ylim的情况下使轴居中吗?“
没有

相关问题