1.需求

  1. 给定一个二维数组 100行, 5列, 每一列绘制一条折线, 横轴为行索引, 纵轴为对应位置的值, 绘制在一个子图里面, 使用python plot,
  2. 使用随机颜色进行区别
  3. 添加显示和隐藏按钮, 可以对每条折线进行显示和隐藏

2.代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons
from matplotlib.patches import Circle

# 生成一个包含100行、5列的随机二维数组
data = np.random.rand(100, 5)

# 创建图形对象
fig, ax = plt.subplots(figsize=(10, 6))

# 对每一列数据绘制折线图,并使用随机颜色
lines = []
for i in range(5):
    line, = ax.plot(data[:, i], label=f'Line {i+1}', color=np.random.rand(3,))
    lines.append(line)

# 设置图例、标题和坐标轴标签
ax.legend()
ax.set_title('Line Plots of 5 Columns')
ax.set_xlabel('Row Index')
ax.set_ylabel('Value')

# 创建显示和隐藏按钮,自定义按钮样式
rax = plt.axes([0.05, 0.5, 0.1, 0.4], frameon=False)
check = CheckButtons(rax, [f'Line {i+1}' for i in range(5)], [True] * 5)

# 定义按钮点击事件处理函数
def toggle_visibility(label):
    index = int(label.split()[-1]) - 1
    lines[index].set_visible(not lines[index].get_visible())
    plt.draw()

check.on_clicked(toggle_visibility)

# 创建按钮的圆形样式
button_circles = []
for i, label in enumerate(check.labels):
    circle = Circle((0.5, 0.5 - i * 0.1), 0.03, color='gray', transform=rax.transAxes, visible=True)
    ax.add_patch(circle)
    button_circles.append(circle)

# 定义按钮点击事件处理函数,切换小圆点的可见性
def toggle_circle(event):
    for circle, line in zip(button_circles, lines):
        if line.get_visible():
            circle.set_visible(True)
        else:
            circle.set_visible(False)
    plt.draw()

toggle_circle(None)

# 注册按钮点击事件处理函数
check.on_clicked(toggle_circle)

# 显示图形
plt.grid(True)
plt.show()

3.效果

全部显示:

只显示指定的折线: