鱼C论坛

 找回密码
 立即注册
楼主: kerln888

[已解决]html5 左边菜单栏保持展开或者关闭的状态

  [复制链接]
发表于 昨天 18:39 | 显示全部楼层
kerln888 发表于 2026-02-22 18:38
@FishC matplotlib可以给子图添加悬停功能吗??


是的,Matplotlib可以通过事件处理给子图添加悬停功能。虽然Matplotlib本身没有内置的悬停组件,但我们可以利用mpl_connect方法绑定鼠标移动事件来实现类似效果。以下是一个简单示例,当鼠标悬停在子图的数据点上时,会显示该点的坐标信息:


  1. import matplotlib.pyplot as plt
  2. import numpy as np

  3. # 创建图形和子图
  4. fig, ax = plt.subplots()
  5. x = np.arange(10)
  6. y = np.random.rand(10)
  7. points, = ax.plot(x, y, 'o')  # 绘制散点图

  8. # 初始化文本对象用于显示悬停信息
  9. hover_text = ax.text(0, 0, '', backgroundcolor='yellow', alpha=0.7)

  10. def on_hover(event):
  11.     # 检查事件是否发生在当前子图内
  12.     if event.inaxes == ax:
  13.         # 计算鼠标位置与数据点的距离
  14.         distances = np.sqrt((x - event.xdata)**2 + (y - event.ydata)**2)
  15.         min_index = np.argmin(distances)
  16.         min_distance = distances[min_index]

  17.         # 如果距离足够近,则显示悬停信息
  18.         if min_distance < 0.5:  # 阈值可根据需要调整
  19.             hover_text.set_text(f'({x[min_index]:.2f}, {y[min_index]:.2f})')
  20.             hover_text.set_position((x[min_index], y[min_index]))
  21.             fig.canvas.draw_idle()
  22.         else:
  23.             hover_text.set_text('')
  24.             fig.canvas.draw_idle()

  25. # 绑定鼠标移动事件
  26. fig.canvas.mpl_connect('motion_notify_event', on_hover)

  27. plt.show()
复制代码


注意事项:
1. 上述代码使用motion_notify_event事件来检测鼠标移动,并通过计算鼠标与数据点的距离来触发悬停显示。
2. 悬停灵敏度通过距离阈值(示例中为0.5)控制,您可以根据实际情况调整。
3. 此方法适用于简单的悬停需求,对于复杂交互(如多子图或大量数据),可能需要更精细的事件处理或考虑使用其他库(如Plotly)。

如果需要为多个子图添加悬停功能,只需为每个子图单独绑定事件并处理相应的数据即可。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 23:44 | 显示全部楼层
@FishC 使用mplcursors对matplotlib增加悬停功能。柱状图x坐标是1,2,3。y轴坐标是1,2,3.如何实现鼠标移动到x轴0到1,y轴0-3这个区域,显示x坐标1的柱状信息
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:45 | 显示全部楼层
kerln888 发表于 2026-02-22 23:44
@FishC 使用mplcursors对matplotlib增加悬停功能。柱 ...


要在鼠标移动到特定区域时显示柱状图信息,可以使用 mplcursors 实现。以下是一个完整的解决方案:


  1. import matplotlib.pyplot as plt
  2. import mplcursors
  3. import numpy as np

  4. # 创建数据
  5. x = [1, 2, 3]
  6. y = [1, 2, 3]
  7. labels = [f"x={xi}, y={yi}" for xi, yi in zip(x, y)]

  8. # 创建图形和坐标轴
  9. fig, ax = plt.subplots()
  10. bars = ax.bar(x, y, color='skyblue', edgecolor='black')

  11. # 自定义悬停函数
  12. def on_hover(sel):
  13.     # 获取鼠标坐标(数据坐标)
  14.     x_mouse, y_mouse = sel.target
  15.    
  16.     # 定义触发区域:x轴0到1,y轴0到3
  17.     if 0 <= x_mouse <= 1 and 0 <= y_mouse <= 3:
  18.         # 显示第一个柱子的信息(索引0对应x=1)
  19.         sel.annotation.set_text(labels[0])
  20.     else:
  21.         # 其他区域正常显示对应柱子的信息
  22.         index = sel.index
  23.         sel.annotation.set_text(labels[index])

  24. # 启用mplcursors
  25. cursor = mplcursors.cursor(bars, hover=True)
  26. cursor.connect("add", on_hover)

  27. # 设置图形属性
  28. ax.set_xlabel('X轴')
  29. ax.set_ylabel('Y轴')
  30. ax.set_title('带悬停功能的柱状图')
  31. ax.set_xticks(x)

  32. plt.show()
复制代码


工作原理:
1. 创建柱状图,每个柱子有对应的标签信息
2. 定义自定义悬停函数 on_hover,检测鼠标位置
3. 当鼠标在x轴0-1、y轴0-3范围内时,显示第一个柱子的信息
4. 在其他区域时,正常显示对应柱子的信息

关键点说明:
- sel.target 获取鼠标在数据坐标系中的位置
- 通过条件判断确定鼠标是否在指定区域内
- 使用 labels[0] 显示第一个柱子的信息(x=1对应的柱子)

如果只想在指定区域显示悬停,可以简化函数:


  1. def on_hover(sel):
  2.     x_mouse, y_mouse = sel.target
  3.     if 0 <= x_mouse <= 1 and 0 <= y_mouse <= 3:
  4.         sel.annotation.set_text(labels[0])
  5.     else:
  6.         sel.annotation.set_visible(False)  # 隐藏悬停
复制代码


这样配置后,当鼠标移动到x轴0-1、y轴0-3区域时,会自动显示第一个柱子的信息。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 23:52 | 显示全部楼层
@FishC matplotlib多柱状图,可以获取x轴和y轴的最大值吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:52 | 显示全部楼层
kerln888 发表于 2026-02-22 23:52
@FishC matplotlib多柱状图,可以获取x轴和y轴的最大 ...


可以获取。以下是具体方法:


  1. import matplotlib.pyplot as plt
  2. import numpy as np

  3. # 示例数据
  4. labels = ['A', 'B', 'C', 'D']  # x轴标签(分类)
  5. data1 = [10, 15, 7, 12]        # 第一组柱子高度
  6. data2 = [8, 10, 14, 9]         # 第二组柱子高度
  7. data3 = [5, 12, 10, 8]         # 第三组柱子高度

  8. x = np.arange(len(labels))     # 柱子的x坐标
  9. width = 0.25                   # 柱子的宽度

  10. fig, ax = plt.subplots()
  11. # 绘制多柱状图
  12. rects1 = ax.bar(x - width, data1, width, label='组1')
  13. rects2 = ax.bar(x, data2, width, label='组2')
  14. rects3 = ax.bar(x + width, data3, width, label='组3')

  15. # 获取y轴最大值(所有柱子中的最大高度)
  16. all_heights = data1 + data2 + data3
  17. y_max = max(all_heights)  # 或者用 np.max(all_heights)
  18. print(f"Y轴最大值 (数据): {y_max}")

  19. # 获取x轴“最大值”的两种常见理解:

  20. # 1. 如果你的x轴是数值型(例如 x = [1,2,3,4]),想要x坐标最大值:
  21. if isinstance(x, np.ndarray):
  22.     x_max_coord = x.max() + width * 2  # 考虑到最右侧柱子的偏移
  23.     print(f"X轴坐标最大值 (考虑多柱偏移): {x_max_coord}")

  24. # 2. 更常见的情况:x轴是分类,我们关心有多少组(即刻度数量)
  25. x_group_count = len(labels)
  26. print(f"X轴分组数量: {x_group_count}")

  27. # 你也可以直接从坐标轴对象获取当前范围
  28. # 注意:这通常在绘制后调用,返回的是当前视图范围
  29. xlim_current = ax.get_xlim()
  30. ylim_current = ax.get_ylim()
  31. print(f"当前X轴范围: {xlim_current}")
  32. print(f"当前Y轴范围: {ylim_current}")

  33. # 设置图表
  34. ax.set_ylabel('Y值')
  35. ax.set_xlabel('X分组')
  36. ax.set_title('多柱状图示例')
  37. ax.set_xticks(x)
  38. ax.set_xticklabels(labels)
  39. ax.legend()

  40. plt.show()
复制代码


关键点解释:
1.  Y轴最大值:直接比较所有柱状图数据列表,找出最大值。
2.  X轴“最大值”
    *   对于分类轴,通常指分组数量 len(labels)
    *   对于数值轴,可计算最大坐标值(需考虑多柱的偏移宽度)。
3.  绘图后,可用 ax.get_xlim()ax.get_ylim() 获取坐标轴当前显示范围。

这样就能灵活获取和控制图表边界了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 23:57 | 显示全部楼层
@FishC 回到刚刚的问题。使用mplcursors对matplotlib增加悬停功能。柱状图x坐标不是数字1,2,3,而是苹果,香蕉,荔枝。y轴坐标是1%,2%,3%.如何实现鼠标移动到x轴0到苹果,y轴0-3%这个区域,显示x坐标苹果的柱状信息。移动到x轴苹果到香蕉,y轴0-3%这个区域,显示x坐标香蕉的柱状信息。移动到x轴香蕉到荔枝,y轴0-3%这个区域,显示x坐标荔枝的柱状信息。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:58 | 显示全部楼层
kerln888 发表于 2026-02-22 23:57
@FishC 回到刚刚的问题。使用mplcursors对matplotlib ...


要使用 mplcursors 实现柱状图的悬停功能,并按照指定区域显示对应分类的信息,可以按照以下步骤操作:

1. 创建柱状图时,直接使用分类数据(如苹果、香蕉、荔枝)作为 x 坐标,matplotlib 会自动处理。
2. 使用 mplcursors 绑定到柱状图对象,并设置悬停事件。
3. 在悬停事件中,通过索引获取对应的分类和数值,并显示在注解中。

以下是完整的代码示例:


  1. import matplotlib.pyplot as plt
  2. import mplcursors

  3. # 数据准备
  4. x_categories = ['苹果', '香蕉', '荔枝']
  5. y_values = [1, 2, 3]  # 百分比数值

  6. # 创建柱状图
  7. fig, ax = plt.subplots()
  8. bars = ax.bar(x_categories, y_values)

  9. # 设置 y 轴标签和范围
  10. ax.set_ylabel('百分比')
  11. ax.set_ylim(0, max(y_values) + 1)

  12. # 初始化 mplcursors,绑定到柱状图对象
  13. cursor = mplcursors.cursor(bars, hover=True)

  14. # 定义悬停时显示的信息
  15. @cursor.connect("add")
  16. def on_add(sel):
  17.     # 获取当前柱子的索引
  18.     index = sel.target.index
  19.     # 根据索引获取分类和数值
  20.     label = x_categories[index]
  21.     value = y_values[index]
  22.     # 设置注解文本
  23.     sel.annotation.set_text(f"{label}: {value}%")

  24. plt.show()
复制代码


代码说明:
- x_categories 存储分类标签,y_values 存储对应的百分比数值。
- ax.bar() 直接使用分类数据创建柱状图,每个柱子对应一个分类。
- mplcursors 绑定到 bars 对象,当鼠标悬停在柱子上时触发事件。
- on_add 函数中,通过 sel.target.index 获取柱子索引,从而得到分类和数值,并设置注解文本。

运行此代码后,鼠标悬停在每个柱子上(即对应的 x 轴区域)时,会显示该柱子的分类和百分比信息。例如,悬停在第一个柱子上(对应 x 轴“苹果”区域)会显示“苹果: 1%”。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 小时前 | 显示全部楼层
@FishC matplotlib legend可以放在坐标外吗?比如放在坐标下面
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层
kerln888 发表于 2026-02-23 00:20
@FishC matplotlib legend可以放在坐标外吗?比如放在 ...


是的,Matplotlib 的图例可以放在坐标轴外部,比如坐标下面。你可以使用 bbox_to_anchor 参数来指定图例的位置。

示例代码:


  1. import matplotlib.pyplot as plt

  2. # 创建示例数据
  3. x = [1, 2, 3, 4]
  4. y1 = [1, 4, 9, 16]
  5. y2 = [2, 5, 10, 17]

  6. plt.plot(x, y1, label='Line 1')
  7. plt.plot(x, y2, label='Line 2')

  8. # 将图例放在坐标轴下方,居中
  9. plt.legend(bbox_to_anchor=(0.5, -0.1), loc='upper center')

  10. # 调整图形边界,确保图例显示完整
  11. plt.subplots_adjust(bottom=0.2)

  12. plt.show()
复制代码


在这个例子中,bbox_to_anchor=(0.5, -0.1) 将图例定位在坐标轴下方(水平居中,y 坐标为负值表示在轴外),loc='upper center' 设置图例的锚点在图例的上方中心。使用 plt.subplots_adjust(bottom=0.2) 可以增加底部空间,防止图例被裁剪。你也可以尝试其他位置,比如将 bbox_to_anchor 设置为 (0, -0.1) 来左对齐,或者调整 loc 参数如 'lower center' 来微调。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 小时前 | 显示全部楼层
@FishC matplotlib子图的legend可以放在坐标外吗?ax1 = fig.add_subplot(gs[0, 0]),比如放在坐标下面
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层
kerln888 发表于 2026-02-23 00:39
@FishC matplotlib子图的legend可以放在坐标外吗?ax1 ...


可以,matplotlib 的子图图例可以通过 bbox_to_anchor 参数放置在坐标轴外部,例如坐标下方。以下是一个示例代码,展示如何实现:


  1. import matplotlib.pyplot as plt

  2. # 创建图形和网格子图
  3. fig = plt.figure()
  4. gs = fig.add_gridspec(1, 1)  # 简单网格示例
  5. ax1 = fig.add_subplot(gs[0, 0])  # 创建子图

  6. # 绘制示例数据
  7. ax1.plot([1, 2, 3], [1, 4, 9], label='示例曲线')

  8. # 添加图例,放置在坐标轴下方外部
  9. # bbox_to_anchor 的 (0.5, -0.1) 表示在坐标轴中心下方(负值表示外部)
  10. ax1.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=1)

  11. # 调整布局以避免图例被裁剪
  12. plt.tight_layout()

  13. plt.show()
复制代码


关键点:
- 使用 bbox_to_anchor 指定图例位置,例如 (0.5, -0.1) 将图例放在子图中心下方。
- loc='upper center' 设置图例锚点为子图上部中心,与 bbox_to_anchor 配合。
- plt.tight_layout() 自动调整布局,确保图例可见。

如果图例仍被裁剪,可手动调整子图位置,例如:

  1. plt.subplots_adjust(bottom=0.2)  # 为底部留出更多空间
复制代码


此方法适用于任何子图,包括通过 add_subplot(gs[...]) 创建的。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-23 05:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表