如何解决Matplotlib中colormap引发的ValueError错误?
错误成因及解决方法
错误成因
plt.plot()的c参数不支持直接传入纯数值数组作为颜色值。该参数仅接受合法的单一颜色表示(如'red'、'#FF0000'),或配合cmap时需先完成数值到颜色空间的映射,但plot本身不具备自动映射的能力。- 直接调用
plt.colorbar()无法找到对应的颜色映射对象,因为plot生成的线条对象不属于ScalarMappable类型,无法直接绑定颜色条。
解决方法
方法一:改用plt.scatter()(推荐)
scatter原生支持为每个点设置独立颜色,且能自动生成颜色映射,配合colorbar使用更便捷:
import numpy as np import matplotlib.pyplot as plt t = np.array(range(0, 10)) y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4]) colormap = t def DrawGraph(): plt.figure(figsize=(20,6)) # 使用scatter设置点大小、颜色数组、标记样式及颜色映射 scatter = plt.scatter(t, y, s=50, c=colormap, marker=">", cmap='viridis') plt.colorbar(scatter) # 绑定scatter对象生成颜色条 plt.show() DrawGraph()
方法二:保留plt.plot(),手动完成颜色映射
若坚持使用plot,需先通过颜色映射器将数值数组转换为实际颜色值:
import numpy as np import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable t = np.array(range(0, 10)) y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4]) colormap = t def DrawGraph(): plt.figure(figsize=(20,6)) # 创建归一化器和颜色映射 norm = plt.Normalize(colormap.min(), colormap.max()) cmap = plt.get_cmap('viridis') # 将数值数组转换为颜色数组 colors = cmap(norm(colormap)) # 逐个绘制带颜色的标记点 for x, y_val, color in zip(t, y, colors): plt.plot(x, y_val, marker=">", markersize=10, color=color) # 手动创建ScalarMappable对象以生成颜色条 sm = ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) plt.colorbar(sm) plt.show() DrawGraph()
内容的提问来源于stack exchange,提问作者yoonseo
相关产品推荐
相关产品推荐

