Matplotlib 3D散点图颜色映射失效问题求助
问题描述
我有一个形状为(100,3)的numpy随机坐标数组x1-x3,每个坐标点对应一个通过自定义函数计算得到的y值,存储在形状为(100,1)的数组中。我希望绘制3D(4D)散点图,用三个坐标轴展示坐标,颜色表示y值。
当前代码如下:
rand_coords = np.random.rand(100, 3) #example x1_values = rand_coords[:, 0] x2_values = rand_coords[:, 1] x3_values = rand_coords[:, 2] y_values = calculate_fitness_var(a_shape, em, rand_coords) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') scatter = ax.scatter(x1_values, x2_values, x3_values, c=y_values, cmap='viridis', marker='o') ax.set_xlabel('coordinate 1') ax.set_ylabel('coordinate 2') ax.set_zlabel('coordinate 3') ax.set_title('Fitness for coordinates') fig.colorbar(scatter, label='Fitness') plt.show()
目前代码可运行,但颜色映射失效:虽已将y_values赋值给c参数,却无法用颜色表示y值,颜色随机且颜色条为黑白渐变。更换配色方案也无效,出现警告:"UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored"。请问问题出在哪里?
问题原因与解决方法
问题出在y_values的形状上——你的y_values是形状为(100,1)的二维数组,而matplotlib的scatter函数要求c参数传入一维数组(形状为(100,))。
当传入二维数组时,matplotlib无法正确解析颜色数据,会触发警告并忽略配色方案,导致颜色显示异常。
解决方法很简单,把y_values转换成一维数组即可,两种常用方式:
- 方式一:使用
ravel()方法扁平化数组scatter = ax.scatter(x1_values, x2_values, x3_values, c=y_values.ravel(), cmap='viridis', marker='o') - 方式二:通过索引提取一维数据
scatter = ax.scatter(x1_values, x2_values, x3_values, c=y_values[:,0], cmap='viridis', marker='o')
修改后,颜色映射会正常工作,viridis配色方案会根据y_values的数值正确渲染,颜色条也会对应显示渐变。
内容的提问来源于stack exchange,提问作者Anne
相关产品推荐
相关产品推荐

