簡體   English   中英

在 matplotlib 中獲取 Axes 繪圖區域的真正限制?

[英]Get true limit of plot area of an Axes in matplotlib?

我想找出 matplotlib Axes 對象內數據的確切范圍; 即,它們的最高和最低 x 值,以及最高和最低 y 值。 (我的特定應用程序只需要我能夠確定誤差小於 0.5 的最高 x 值,但我對一般情況很好奇。)

您應該使用Axes.get_xlim().get_ylim()來獲取 Axes 對象的范圍,但由於邊距,這些限制將略微超出數據限制。 例如:

import matplotlib.pyplot as plt

plt.plot(range(100), range(100))
ax = plt.gca()
print(ax.get_xlim()) # prints (-4.95, 103.95)

邊距由Axes.margins()作為軸的一部分給出,那么如果我們減去它們呢? 我們最終有點低估了限制:

xlim, xmargin = ax.get_xlim(), ax.margins()[0]
width = xlim[1] - xlim[0]
lower_xlim = xlim[0] + width*xmargin # 0.495, should be 0
upper_xlim = xlim[1] - width*xmargin # 98.505, should be 99

通過反復試驗,我們發現如果我們將校正項乘以10/11 ,我們終於達到了目標:

lower_xlim = xlim[0] + width*xmargin*10/11 # 0.
upper_xlim = xlim[1] - width*xmargin*10/11 # 99.

使用不同的數據范圍和邊距大小仔細檢查后,發現實際因素是:

lower_xlim = xlim[0] + width*5/110 # 0.
upper_xlim = xlim[1] - width*5/110 # 99.

很奇怪,但效果很好。 除了......如果我們使用Axes.imshow()而不是Axes.plot()呢? 在這種情況下,繪圖沒有邊距(如果Axes.use_sticky_edges()True ,這是默認值),但Axes.margins()的結果是相同的。 此外,這可能會因添加非數據藝術家(例如當前邊界之外的文本框)而變得混亂。 (也許。我從未嘗試過。)

我知道找到數據限制的一種萬無一失的方法是遍歷 Axes 對象中的所有數據並計算它們的最大值和最小值。 這可以通過使用Axes.get_children()找出 Axes 對象的藝術家,並從提供.get_data()方法的藝術家Axes.get_children()獲取數據來完成。 但這在計算上非常昂貴。

有沒有更好的辦法? 或者我的 5/110 hack 是下一個最好的東西? 為什么甚至需要 5/110 因子? 為什么它不依賴於xmargin (我應該先調用Axes.autoscale()嗎?)

這應該可以正常工作:

lower_xlim = xlim[0] + (0.5 * xmargin) / (0.5 + xmargin) * width
upper_xlim = xlim[1] - (0.5 * xmargin) / (0.5 + xmargin) * width

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM