如何在Python中平滑绘制Y<18x²的不等式阴影区域?
解决Y<18x²区域绘图阶梯状问题
问题根源
你代码里的x和y采样点数量太少(仅25和20个),导致imshow只能用离散的网格块拼接显示,即使添加插值也无法彻底消除阶梯感;另外imshow更适合图像数据可视化,并非数学区域填充的最优选择。
三种平滑绘图方案
方案1:用contourf(推荐,最适配不等式区域填充)
contourf专门用于等高线填充,能自然生成平滑的区域边界:
import numpy as np import matplotlib.pyplot as plt # 提升采样密度,保证边界平滑 x = np.linspace(-0.25, 0.25, 200) y = np.linspace(0, 1, 200) X, Y = np.meshgrid(x, y) # 填充Y<18X²的区域 plt.contourf(X, Y, (Y < 18*X**2).astype(float), levels=[0, 1], colors='grey', alpha=0.3) # 可选:添加抛物线边界线,让区域更清晰 plt.contour(X, Y, 18*X**2, levels=[0], colors='black', linewidths=1) plt.xlim(-0.25, 0.25) plt.ylim(0, 1) plt.show()
方案2:提升网格密度+优化imshow插值
如果坚持用imshow,需要大幅增加采样点数量,并更换更适合的插值方法:
import numpy as np import matplotlib.pyplot as plt # 大幅增加采样点,减少离散块的视觉效果 x = np.linspace(-0.25, 0.25, 500) y = np.linspace(0, 1, 500) X, Y = np.meshgrid(x, y) plt.imshow((Y < 18*X**2).astype(float), extent=(X.min(), X.max(), Y.min(), Y.max()), origin="lower", cmap="Greys", alpha=0.3, aspect='auto', interpolation='bilinear') # bilinear插值比hanning更适合这种场景 plt.show()
方案3:用fill_between(针对抛物线下方区域的极简方案)
因为Y<18x²是抛物线下方的区域,直接用fill_between填充曲线与y=0之间的区域更简洁:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-0.25, 0.25, 200) y_curve = 18 * x**2 # 填充抛物线下方到y轴底部的区域 plt.fill_between(x, 0, y_curve, color='grey', alpha=0.3) plt.xlim(-0.25, 0.25) plt.ylim(0, 1) plt.show()
内容的提问来源于stack exchange,提问作者S-low
相关产品推荐
相关产品推荐

