You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Matplotlib和Python绘制布尔数据填充矩形图?

嘿,你说的这种布尔多通道的填充图我太熟悉啦!Matplotlib里确实没有专门为这个场景做的开箱即用函数,但有两种非常简洁高效的实现方式,比你预想的手动逐个写子图要省心得多,完全能达到你想要的效果。

实现布尔多通道填充图的两种实用方案

方法1:用pcolormesh绘制紧凑的热力图风格图

这种方法最适合把所有通道集中在同一个轴上展示,每个通道对应一行,布尔值为True(或1)的区域会被填充颜色,和你提到的C#示例图风格高度匹配。你只需要把布尔数据整理成二维数组:每一行代表一个通道,每一列对应一个X轴的位置。

示例代码:

import matplotlib.pyplot as plt
import numpy as np

# 模拟数据:5个通道,100个时间点的布尔值
n_channels = 5
n_timepoints = 100
x = np.arange(n_timepoints)
# 随机生成布尔数据(True表示需要填充)
bool_data = np.random.randint(0, 2, size=(n_channels, n_timepoints)).astype(bool)

fig, ax = plt.subplots(figsize=(10, 4))

# 使用pcolormesh绘制,用二元配色区分布尔值,添加白色网格线分隔通道
cmap = plt.cm.get_cmap('Blues', 2)
ax.pcolormesh(x, np.arange(n_channels), bool_data, cmap=cmap, edgecolors='white', linewidth=1)

# 自定义轴标签和刻度
ax.set_yticks(np.arange(n_channels))
ax.set_yticklabels([f'Channel {i+1}' for i in range(n_channels)])
ax.set_xlabel('Time/Index')
ax.set_title('Boolean Channel Fill Plot')

plt.tight_layout()
plt.show()

这种方式代码简洁,不需要创建多个子图,视觉上紧凑清晰,非常适合快速展示多通道的布尔状态变化。

方法2:批量创建共享X轴的子图,用fill_between填充

如果你更倾向于每个通道单独成子图的布局(共享X轴,避免重复刻度),可以用循环批量处理,不用手动逐个编写子图代码:

import matplotlib.pyplot as plt
import numpy as np

# 模拟数据
n_channels = 5
n_timepoints = 100
x = np.arange(n_timepoints)
bool_data = np.random.randint(0, 2, size=(n_channels, n_timepoints)).astype(bool)

# 创建共享X轴的子图网格
fig, axes = plt.subplots(nrows=n_channels, ncols=1, figsize=(10, 6), sharex=True)

# 循环处理每个通道
for i, ax in enumerate(axes):
    # 填充布尔值为True的区域
    ax.fill_between(x, 0, 1, where=bool_data[i], color='darkgreen', alpha=0.6)
    # 设置子图的通道标签
    ax.set_yticks([0.5])
    ax.set_yticklabels([f'Channel {i+1}'])
    # 隐藏多余的Y轴刻度线,让布局更干净
    ax.tick_params(axis='y', which='both', length=0)

# 设置公共X轴标签
axes[-1].set_xlabel('Time/Index')
fig.suptitle('Boolean Channel Subplots with Fill', y=1.02)

plt.tight_layout()
plt.show()

这种布局适合需要单独观察每个通道细节的场景,通过循环批量处理,代码量也非常精简。

额外小技巧

  • 你可以给不同通道设置不同的填充颜色,只需要在循环里定义一个颜色列表,逐个调用即可。
  • 如果你的X轴是时间序列(比如datetime类型),直接把x替换成时间数组,Matplotlib会自动适配时间刻度。

总的来说,虽然没有现成的一键函数,但这两种方法都能快速实现你想要的效果,而且灵活性拉满,可以根据你的需求调整布局和样式。

内容的提问来源于stack exchange,提问作者S.B.G

火山引擎 最新活动