如何避免Matplotlib中axvspan添加的边距,消除阴影与轴边框间隙?
解决Matplotlib中axvspan阴影与轴边框存在间隙的问题
问题描述
我想要给散点图的一半背景添加阴影,以此区分两种不同的状态。尝试用axvspan实现时,发现Matplotlib会自动给阴影添加边距,导致阴影和轴边框之间出现难看的间隙,请问该如何解决?
尝试代码
import matplotlib.pyplot as plt import numpy as np nsamp = 50 x = np.random.rand(nsamp) y = np.random.rand(nsamp) fig, ax = plt.subplots(1, 1, figsize=(8, 8)) ax.scatter(x, y) ax.use_sticky_edges = True _, xmax = plt.gca().get_xlim() ax.axvspan(0.5, xmax=xmax, color="#97999B", zorder=-1) plt.show()
当前效果

解决方法
问题核心是你调用get_xlim()的时机不对:绘制散点图后,Matplotlib会自动调整轴范围适配数据,但此时你获取的xmax是调整前的初始值,用它绘制axvspan自然会和实际轴边界产生间隙。
方法一:先更新轴范围再获取边界值
先让Matplotlib完成轴范围的自动调整,再获取正确的x轴最大值:
import matplotlib.pyplot as plt import numpy as np nsamp = 50 x = np.random.rand(nsamp) y = np.random.rand(nsamp) fig, ax = plt.subplots(1, 1, figsize=(8, 8)) ax.scatter(x, y) # 触发轴范围自动更新 ax.autoscale() _, xmax = ax.get_xlim() ax.axvspan(0.5, xmax=xmax, color="#97999B", zorder=-1) plt.show()
方法二:强制指定轴范围(更直接)
如果已知数据的范围(比如本例中x是0到1的随机数),可以直接强制设置轴范围,避免自动调整带来的问题:
import matplotlib.pyplot as plt import numpy as np nsamp = 50 x = np.random.rand(nsamp) y = np.random.rand(nsamp) fig, ax = plt.subplots(1, 1, figsize=(8, 8)) ax.scatter(x, y) # 强制设置x轴范围为0到1 ax.set_xlim(0, 1) ax.axvspan(0.5, 1, color="#97999B", zorder=-1) plt.show()
另外,ax.use_sticky_edges = True对这个问题没有帮助,可以直接移除。
内容的提问来源于stack exchange,提问作者Philipp Weder
相关产品推荐
相关产品推荐

