You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:15:43