【问题标题】:ConnectionPatch breaks constrained_layout when crossing axesConnectionPatch 在交叉轴时中断 constrained_layout
【发布时间】:2019-07-28 03:27:21
【问题描述】:

我正在尝试在同一图中的两个轴之间创建一个 ConnectionPatch,在 this example 之后,plt.subplots(..., constrained_layout=True)。我看到了所有的补丁,但是轴更小并且向两侧挤压。

1https://matplotlib.org/3.1.1/gallery/userdemo/connect_simple01.html#sphx-glr-gallery-userdemo-connect-simple01-py

我下载了示例代码并在使用 matplotlib 3.1.1 和 python 3.6.7 的 conda 环境中执行它。我已经在 jupyter notebook 和传统的 python 脚本中运行了这个示例,结果相似。如果我在第 26 行注释掉 add_artist 调用,布局看起来又正常了。

奇怪的是,当我今天早些时候在另一台机器上运行它时,它运行良好。

我期望像示例中所示的布局:

相反,我得到了一个轴缩小并偏向一边的图像:

【问题讨论】:

  • 问题是第二个箭头,它是根据两个不同的数据坐标系定义的。我不确定 “奇怪的是,当我今天早些时候在另一台机器上运行它时它运行良好。” 是什么意思,所以如果你能澄清正在使用的版本和可能的其他差异,它可能会有所帮助.否则,请随时report it,但我不确定是否可以做任何事情。
  • 对,如果我去掉第二个箭头,它看起来是对的,但这是我最感兴趣的功能。我明天会用我的工作计算机的软件包版本更新问题。跨度>

标签: python matplotlib


【解决方案1】:

经过一番思考,我现在确信没有合理的方法可以对在两个不同轴的数据坐标中定义的 ConnectionPatches 执行布局管理。

因此,解决方案必须是从布局管理器中排除此类艺术家。

fig, (ax, ...) = plt.subplots(..., contrained_layout=True)
# ....
con = ConnectionPatch(...)
con.set_in_layout(False)
ax.add_artist(con)

或者你可以在添加艺术家之前使用tight_layout,比如

fig, (ax, ...) = plt.subplots(...)
# ....
con = ConnectionPatch(...)

fig.tight_layout()
ax.add_artist(con)

【讨论】:

  • 很可能是这样。该示例不使用布局管理,但也许 OP 在他们的 matplotlibrc 中有一些东西正在打开它?
  • 是的,我的 matplotlibrc 中确实有 constrained_layout,但我忘了在问题中包含它。 set_in_layout 解决方案就像一个魅力。非常感谢。我发现 tight_layout() 在调用 save_fig 到 pgf 文件时会更改图形尺寸。除了这个 MWE,我还在为期刊出版准备图表,所以图表的大小很重要。我将在 github 上向 mpl 提交一个问题,以便在文档中添加关于此的注释。再次感谢您的帮助。
  • 您也可以尝试将艺术家添加为人物艺术家。
猜你喜欢
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多