如何实现Matplotlib eventplot相邻整数事件无空白且适配窗口缩放?
实现整数位置的双色事件图(相邻无空白/非相邻等宽间隔)
原eventplot无法精准控制事件块的贴合与间隔,且窗口缩放后会错位,改用矩形块绘制是更合适的方案,能完美满足:相邻整数事件无空白、非相邻间隔与事件宽度一致、整数范围可变的需求。
核心思路
- 每个整数位置对应一个宽度为1的矩形块,相邻块自然贴合,非相邻的间隔等于整数差(即空白宽度与事件块宽度一致)
- 有事件的位置根据类别设为红/绿色,无事件的位置设为白色
- 用
matplotlib.patches.Rectangle绘制每个块,确保缩放时元素比例保持一致
完整代码
import matplotlib.pyplot as plt import numpy as np from matplotlib.patches import Rectangle matplotlib.rcParams['font.size'] = 8.0 # 事件数据:两行分别对应绿色、红色事件的整数位置 data1 = np.array([[19, 2, 3, 4, 6, 34, 23, 60, 49, 36], [52, 50, 33, 96, 56, 95, 0, 63, 90, 15]]) # 颜色映射:第一行绿色,第二行红色 color_map = ["green", "red"] # 事件块的高度(可根据需求调整) block_height = 1 # 确定所有事件的整数范围,包含最小和最大整数 all_events = np.concatenate(data1) min_x = all_events.min() max_x = all_events.max() fig, ax = plt.subplots() # 遍历每个整数位置,绘制对应颜色的矩形块 for x in range(min_x, max_x + 1): # 检查当前x属于哪一行事件,或无事件 color = "white" for idx, row in enumerate(data1): if x in row: color = color_map[idx] break # 绘制矩形:左下角坐标(x, 0),宽度1,高度block_height rect = Rectangle((x, 0), 1, block_height, color=color, ec="black") # ec是边框颜色,可选 ax.add_patch(rect) # 调整坐标轴范围,让所有块完整显示 ax.set_xlim(min_x - 0.5, max_x + 0.5) ax.set_ylim(0, block_height) # 隐藏y轴(如果不需要) ax.set_yticks([]) plt.xlabel("整数位置") plt.title("双色整数事件图") plt.show()
关键细节说明
- 矩形块宽度固定为1,确保相邻整数位置的块完全贴合,非相邻的间隔(如x=4到x=6)自动为1,和事件块宽度一致
- 遍历所有整数位置,通过检查是否在事件列表中分配对应颜色,无事件则为白色
- 使用
add_patch添加矩形,缩放时矩形会保持宽高比例,不会出现错位问题 - 可通过调整
block_height改变事件块的高度,ec参数控制边框颜色(不需要可去掉)
内容的提问来源于stack exchange,提问作者tfv
相关产品推荐
相关产品推荐

