如何获取多个pcolormesh生成的拼接组合数组?
解决方案
方法1:生成数据时直接拼接(最推荐,性能最高,不易出错)
不需要事后从pcolormesh对象里捞数据,直接在生成每个5x5随机数组的时候就写入预先初始化的大数组即可,代码修改如下:
import matplotlib.pyplot as plt import numpy as np # 预先定义拼接参数 block_size = 5 h_blocks = 2 # ih循环次数,y方向块数 w_blocks = 5 # iw循环次数,x方向块数 # 初始化最终的大数组,维度对应[总y方向长度, 总x方向长度] = [2*5,5*5] = 10x25,需要25x10直接转置即可 full_arr = np.zeros((h_blocks * block_size, w_blocks * block_size)) def add_randam_data(ax, h, w): D = np.random.uniform(0, 100, size=(block_size, block_size)) mesh = ax.pcolormesh(np.arange(D.shape[0]+1)+w*D.shape[0], np.arange(D.shape[1]+1)+h*D.shape[1], D) # 把当前块写入大数组对应位置 full_arr[h*block_size : (h+1)*block_size, w*block_size : (w+1)*block_size] = D return mesh fig, ax = plt.subplots(1,1, figsize=(10, 5)) for ih in range(0,h_blocks): for iw in range(0,w_blocks): mesh = add_randam_data(ax,ih,iw) plt.show() # 保存数组 # 存为二进制npy格式(方便后续python读取) np.save("full_arr.npy", full_arr) # 存为文本csv格式 np.savetxt("full_arr.csv", full_arr, delimiter=",") # 需要25x10格式的话替换为 full_arr.T 保存即可
方法2:从已绘制的pcolormesh对象中提取拼接
如果无法修改前面的绘图代码,也可以从axes的collections属性中遍历所有pcolormesh对象,提取数据后按坐标位置拼接:
# 放在plt.show()之前执行即可 block_size = 5 h_blocks = 2 w_blocks = 5 full_arr = np.zeros((h_blocks * block_size, w_blocks * block_size)) # 遍历所有pcolormesh对象 for mesh in ax.collections: # 获取当前mesh的坐标范围 x0, x1, y0, y1 = mesh.get_extent() # 计算当前块的位置索引 h_idx = int(y0 // block_size) w_idx = int(x0 // block_size) # 提取当前块数据,注意get_array返回的是扁平化数组,需要reshape回原尺寸 block_data = mesh.get_array().reshape(block_size, block_size) # 写入大数组 full_arr[h_idx*block_size : (h_idx+1)*block_size, w_idx*block_size : (w_idx+1)*block_size] = block_data # 后续保存逻辑和方法1一致
内容的提问来源于stack exchange,提问作者kilometer
相关产品推荐
相关产品推荐

