如何在Matplotlib中为函数定义区域添加图案填充(Hatching)?
解决Matplotlib函数曲线区域图案填充问题
你的问题出在三次函数$f(x)=x3+x2+17$会穿过x轴,直接使用填充方法会覆盖曲线与x轴之间的所有区域(包括x轴上下两侧)。要实现精准的图案填充,需要先定位函数与x轴的交点,再限定填充范围。
修改后的代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg fig, ax = plt.subplots() plt.title('$f(x)= x^3 + x^2 + 17 $') plt.minorticks_on() plt.grid() plt.xlabel('x') plt.ylabel('y') # 增加采样点数,让曲线和填充边缘更平滑 x = np.linspace(-100, 100, 1000) def y(x): return x**3 + x**2 + 17 y_vals = y(x) ax.plot(x, y_vals) ax.axhline(color='green', lw=2, alpha=0.7) # 求解函数与x轴的交点(实根) roots = np.roots([1, 1, 0, 17]) real_root = roots[np.isreal(roots)].real[0] # 填充x轴上方的区域,使用斜杠图案 ax.fill_between(x, y_vals, 0, where=(y_vals >= 0), hatch='///', facecolor='none', edgecolor='blue', alpha=0.5) # 填充x轴下方的区域,使用反斜杠图案 ax.fill_between(x, y_vals, 0, where=(y_vals <= 0), hatch='\\\\\\', facecolor='none', edgecolor='red', alpha=0.5) canvas = FigureCanvasTkAgg(fig, self) canvas.draw() canvas.get_tk_widget().place(x=300, y=0)
关键说明
- 精准定位交点:用
np.roots求解三次方程的实根,作为填充区域的分界点(该函数仅存在一个实根)。 - 限定填充范围:通过
fill_between的where参数,仅填充曲线在x轴上方(y_vals >=0)或下方(y_vals <=0)的区域,避免全局填充。 - 图案与样式调整:
hatch参数支持多种图案:'///'斜杠、'\\\\\\'反斜杠、'xxx'叉号、'+++'加号、'..'点等。facecolor='none'仅显示图案边框,不会覆盖网格;调整edgecolor和alpha可优化视觉效果。
- 平滑曲线:将x的采样点数从默认的50增加到1000,让填充边缘更贴合曲线。
内容的提问来源于stack exchange,提问作者bigidulka
相关产品推荐
相关产品推荐

