matplotlib中如何为数据点分配DataFrame对应二进制值
问题说明
使用matplotlib的plt接口创建二值地图时,已完成所有x、y坐标位置的数据点绘制,但无法从尺寸、形状与坐标网格完全一致的存储二值的DataFrame中,为每个数据点匹配对应二进制值,初始实现代码如下:
import pandas as pd import matplotlib.pyplot as plt import numpy as np # gd是每个i,j索引位置都存储了二值的DataFrame gd = pd.read_csv('SIG_Warehouse.csv',header=None) x =[] y =[] for i in range(gd.shape[0]): for j in range(gd.shape[1]): x.append(i) y.append(j) plt.scatter(x,y) plt.show()
实现方案
当前代码仅遍历收集了网格坐标,没有同步提取每个(i,j)坐标对应的DataFrame二值,以下两种方案均可实现需求:
方案1:适配现有散点绘制逻辑
遍历坐标时同步提取对应位置的二值,传入plt.scatter()的c(颜色映射)参数即可,二值会自动映射为两种区分颜色,也可自定义参数调整显示效果:
import pandas as pd import matplotlib.pyplot as plt import numpy as np gd = pd.read_csv('SIG_Warehouse.csv',header=None) x = [] y = [] binary_vals = [] # 遍历坐标时同步收集对应位置的二值 for i in range(gd.shape[0]): for j in range(gd.shape[1]): x.append(i) y.append(j) binary_vals.append(gd.iloc[i, j]) # c参数传入二值序列,cmap自定义配色:binary为黑白二值,marker='s'设为方块标记,s参数调整标记大小适配网格 plt.scatter(x, y, c=binary_vals, cmap='binary', marker='s', s=50) plt.colorbar(label='二值标识') plt.show()
方案2:栅格直接绘制(更推荐)
二值地图属于规则栅格图,不需要手动遍历生成散点,直接调用plt.imshow()传入DataFrame的二维数组即可,代码更简洁、渲染效率更高,不会出现散点尺寸不匹配导致的栅格缝隙问题:
import pandas as pd import matplotlib.pyplot as plt import numpy as np gd = pd.read_csv('SIG_Warehouse.csv',header=None) # origin='lower'保证坐标原点在左下角,和散点绘制的坐标方向一致;extent参数可自定义x/y轴的数值范围 plt.imshow(gd.values, cmap='binary', origin='lower') plt.colorbar(label='二值标识') plt.show()
实现注意点
- 取DataFrame对应位置的值时使用
gd.iloc[i,j]按位置索引,不要直接用gd[i][j]或gd.loc[i,j],避免DataFrame索引不是默认从0开始的数字序列时取值出错 - 二值配色可根据需求替换
cmap参数,比如'gray'为灰度配色、'bwr'为蓝红对比配色 - 若imshow绘制后坐标上下颠倒,调整
origin参数为'upper'即可将第一行数据放在图像顶部
内容的提问来源于stack exchange,提问作者daniel gaskell
相关产品推荐
相关产品推荐

