如何在Conditional contour plot中添加f(x,y)<9的禁入区域阴影?
解决条件等高线图中禁入区域着色的问题
嘿,我来帮你搞定这个需求!你之前用plt.contourf没成功,大概率是因为没针对性设置填充的区间范围,其实只需要简单调整参数就能实现你要的效果。
核心思路
我们需要精准定位f(x,y) < 9的区域,用填充工具给该区域上色后,再叠加原来的黑色等高线即可。这里有两种简洁的实现方式:
方法一:用contourf指定填充区间
这是最直接的方式,通过设置levels参数限定只填充Z值小于9的区域:
import numpy as np import matplotlib.pyplot as plt # 生成网格数据 x = np.linspace(0, 30, 1000) y = np.linspace(0, 30, 1000) X, Y = np.meshgrid(x, y) # 定义目标函数 def f(x, y): return x**2 + y**2 Z = f(X, Y) # 填充禁入区域:f(x,y) < 9 # levels设置为[-∞, 9],仅填充该区间内的区域 plt.contourf(X, Y, Z, levels=[-np.inf, 9], colors='lightcoral', alpha=0.5) # 绘制原有黑色等高线 plt.contour(X, Y, Z, colors='black') # 优化图表展示 plt.xlabel('X') plt.ylabel('Y') plt.title('Contour Plot with Restricted Area') plt.axis('equal') # 保持坐标轴比例,确保圆形区域显示正常 plt.show()
关键参数说明:
levels=[-np.inf, 9]:告诉contourf只填充所有Z值小于等于9的区域,精准匹配你的禁入条件alpha=0.5:设置填充透明度,避免遮挡后面的等高线axis('equal'):因为你的函数是圆的方程,这个参数能让禁入区域显示为标准圆形,不会被拉伸
方法二:用掩码数组标记禁入区域
如果需要更灵活的条件判断(比如多个禁入规则),可以先创建掩码数组再填充:
import numpy as np import matplotlib.pyplot as plt # 生成网格数据(同方法一) x = np.linspace(0, 30, 1000) y = np.linspace(0, 30, 1000) X, Y = np.meshgrid(x, y) def f(x, y): return x**2 + y**2 Z = f(X, Y) # 创建掩码:标记f(x,y) < 9的区域为True restricted_area = Z < 9 # 用pcolormesh填充掩码区域 plt.pcolormesh(X, Y, restricted_area, cmap='Reds', alpha=0.5, shading='auto') # 叠加黑色等高线 plt.contour(X, Y, Z, colors='black') # 图表优化(同方法一) plt.xlabel('X') plt.ylabel('Y') plt.title('Contour Plot with Masked Restricted Area') plt.axis('equal') plt.show()
这种方式的优势是可以轻松扩展为复杂条件,比如(Z < 9) | (Z > 81)(同时标记小于9和大于81的区域)。
内容的提问来源于stack exchange,提问作者Christopher Turnbull
相关产品推荐
相关产品推荐

