[英]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.