如何更改skfuzzy生成的Matplotlib模糊变量绘图的colormap?
解决skfuzzy模糊变量可视化的配色修改问题
核心思路
skfuzzy的FuzzyVariableVisualizer在绘制隶属度函数时,会为每个语言变量单独指定线条和填充颜色,全局设置colormap(如plt.set_cmap())不会生效。我们需要手动从目标colormap中提取对应数量的颜色,逐个替换每个隶属度函数的线条和填充色。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt import skfuzzy as fuzz from skfuzzy import control as ctrl from skfuzzy.control import visualization room_temp = ctrl.Antecedent(np.arange(0, 11, 1), 'room temperature') clothing = ctrl.Antecedent(np.arange(0, 11, 1), 'amount of clothing') temp_control = ctrl.Consequent(np.arange(0, 11, 1), 'temperature control') temp_qualitative_values = ['absolute zero', 'freezing', 'extremely cold', 'cold', 'chilly', 'OK', 'warm', 'hot', 'very hot', 'hot as hell', 'melting'] clothing.automf(3) clothing.view() temp_control.automf(5) temp_control.view() # 自定义room_temp的可视化配色 room_temp.automf(10, names=temp_qualitative_values) room_temp_viz = visualization.FuzzyVariableVisualizer(room_temp) fig, ax = room_temp_viz.view() # 从bwr colormap生成对应数量的颜色 cmap = plt.get_cmap('bwr') num_terms = len(room_temp.terms) # 生成从冷(蓝)到暖(红)的渐变颜色 colors = [cmap(i / (num_terms - 1)) for i in range(num_terms)] # 逐个替换线条和填充的颜色 for line, patch, color in zip(ax.lines, ax.patches, colors): line.set_color(color) patch.set_facecolor(color) patch.set_alpha(0.3) # 保持默认的填充透明度 plt.show()
关键步骤说明
- 获取目标colormap:用
plt.get_cmap('bwr')获取蓝-白-红的渐变配色方案。 - 生成对应数量的颜色:根据语言变量的总数(
len(room_temp.terms)),从colormap中均匀提取颜色,确保从最冷的蓝色到最热的红色渐变。 - 替换元素颜色:遍历axes对象中的线条(
ax.lines)和填充块(ax.patches),分别设置它们的颜色,同时保持填充的透明度和默认效果一致。
内容的提问来源于stack exchange,提问作者Alexander Grantcharov
相关产品推荐
相关产品推荐

