You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib滑块控件实现Y轴自动调整问题求助

解决Matplotlib原生滑块控件无法自动调整Y轴的问题

问题背景

开发蛋托生产成本计算图表时,要求固定X轴,让Y轴自动缩放以完整显示曲线。在Jupyter Notebook中使用ipywidgets已实现该功能,但切换到Python IDLE使用Matplotlib原生widgets时,仅曲线数据更新,Y轴范围始终固定,调用ax.autoscale()也无法生效。

解决方案

问题核心是仅更新曲线数据但未触发轴范围的重新计算。修改update函数,在更新曲线后执行以下步骤即可实现Y轴自动调整:

  • 计算新的Y值并更新曲线数据
  • 调用ax.relim()重新计算当前轴的数据边界
  • 调用ax.autoscale(axis='y')仅自动调整Y轴(X轴保持固定)
  • 调用fig.canvas.draw_idle()刷新画布

修改后的完整代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button


# 待绘制的参数化函数
def f(x, electric_cost, ebiogas_sold):
    burner_consumption = (x + 8679) / 17.3
    electric_consumption = (x + 11074) / 19.1

    burner_price = burner_consumption * 2.2 * ebiogas_sold
    electric_price = electric_consumption * electric_cost

    overall_price = burner_price + electric_price

    return overall_price / x


x = np.linspace(50000, 80000, 30001)

# 初始参数
init_electric_cost = 11.37
init_ebiogas_sold = 6.7

# 创建画布与初始曲线
fig, ax = plt.subplots()
line, = ax.plot(x, f(x, init_electric_cost, init_ebiogas_sold), lw=2)
ax.set_xlabel('Egg Tray Produced [pcs]')
# 固定X轴范围,确保不会随数据变化
ax.set_xlim(x.min(), x.max())

# 调整画布布局,为滑块预留空间
fig.subplots_adjust(left=0.25, bottom=0.25)

# 创建电费控制滑块
electric_cost_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03])
electric_cost_slider = Slider(
    ax=electric_cost_ax,
    label="Electric Cost [pesos]",
    valmin=0,
    valmax=20,
    valinit=init_electric_cost,
)

# 创建沼气发电售价控制滑块
biogas_cost_ax = fig.add_axes([0.1, 0.25, 0.0225, 0.63])
biogas_cost_slider = Slider(
    ax=biogas_cost_ax,
    label="Biogas Power Sold [pesos]",
    valmin=0,
    valmax=20,
    valinit=init_ebiogas_sold,
    orientation="vertical"
)

# 滑块值变化时的更新函数
def update(val):
    new_y = f(x, electric_cost_slider.val, biogas_cost_slider.val)
    line.set_ydata(new_y)
    # 重新计算轴数据范围
    ax.relim()
    # 仅自动调整Y轴
    ax.autoscale(axis='y')
    # 刷新画布
    fig.canvas.draw_idle()

# 为滑块绑定更新函数
electric_cost_slider.on_changed(update)
biogas_cost_slider.on_changed(update)

# 创建重置按钮
resetax = fig.add_axes([0.8, 0.025, 0.1, 0.04])
button = Button(resetax, 'Reset', hovercolor='0.975')

def reset(event):
    biogas_cost_slider.reset()
    electric_cost_slider.reset()
button.on_clicked(reset)

plt.show()

内容的提问来源于stack exchange,提问作者Jaycob Clavel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:40:40