如何用Matplotlib以矩阵配色形式绘制三列数据散点图?
问题分析与修正方案
你的代码存在几个关键问题导致无法实现需求:
- 初始定义的
colors是彩色字符串列表,但后续循环中添加的是数字,类型混合导致scatter无法正确识别颜色 - 条件判断逻辑错误:两个
if是独立判断,会导致部分z值被重复匹配;同时边界值(如i=9、i=25)未被正确归类 - 没有使用灰度配色,不符合你要的"不同灰度矩阵形式"需求
以下是修正后的代码,实现基于z值区间的灰度配色:
import numpy as np import matplotlib.pyplot as plt # 读取数据 db = np.loadtxt('text.txt') x = db[:, 0] y = db[:, 1] z = db[:, 2] # 定义三个灰度区间对应的颜色(从浅到深) gray_colors = ['#cccccc', '#888888', '#333333'] # 根据z值生成对应的颜色列表 point_colors = [] for val in z: if val < 9: point_colors.append(gray_colors[0]) elif 9 <= val < 25: point_colors.append(gray_colors[1]) else: point_colors.append(gray_colors[2]) # 绘制散点图 plt.scatter(x, y, c=point_colors, s=100) # s参数可调整点的大小 plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('基于Z值的灰度配色散点图') plt.show()
更简洁的numpy实现方式
如果数据量较大,用numpy的向量化操作代替循环效率更高:
import numpy as np import matplotlib.pyplot as plt db = np.loadtxt('text.txt') x, y, z = db[:,0], db[:,1], db[:,2] # 定义灰度颜色 gray_colors = np.array(['#cccccc', '#888888', '#333333']) # 根据z值生成索引 color_indices = np.where(z < 9, 0, np.where((9 <= z) & (z <25), 1, 2)) point_colors = gray_colors[color_indices] plt.scatter(x, y, c=point_colors, s=100) plt.xlabel('X轴') plt.ylabel('Y轴') plt.show()
额外说明
如果想要更平滑的灰度过渡(而非区间离散配色),可以直接使用matplotlib的灰度色映射:
plt.scatter(x, y, c=z, cmap='gray', s=100) plt.colorbar(label='Z值') # 添加颜色条说明 plt.show()
内容的提问来源于stack exchange,提问作者Masoom
相关产品推荐
相关产品推荐

