python - 将 slider 放在 matplotlib 中子图的正下方

标签 python python-3.x matplotlib matplotlib-widget

我试图将 slider 放在 matplotlib 中子图的 x 轴正下方,以便两者以相同的值开始和结束。有没有一种简单的方法可以做到这一点,这意味着我在创建包含 slider 的 plt.axe 时不必找到正确的坐标并自己放置它们?

最佳答案

您可以使用ax.get_position()来获取x0y0width轴的高度,并使用它来定义 slider 轴的位置。

我改编了matplotlib example显示用例:

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

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.3)
t = np.arange(0.0, 1.0, 0.001)
a0 = 5
f0 = 3
delta_f = 5.0
s = a0 * np.sin(2 * np.pi * f0 * t)
l, = plt.plot(t, s, lw=2)
ax.margins(x=0)

axcolor = 'lightgoldenrodyellow'

def xaligned_axes(ax, y_distance, width, **kwargs):
    return plt.axes([ax.get_position().x0,
                     ax.get_position().y0-y_distance,
                     ax.get_position().width, width],
                    **kwargs)

axfreq = xaligned_axes(ax=ax, y_distance=0.1, width=0.03, facecolor=axcolor)
axamp = xaligned_axes(ax=ax, y_distance=0.15, width=0.03, facecolor=axcolor)

sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0, valstep=delta_f)
samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0)

def update(val):
    amp = samp.val
    freq = sfreq.val
    l.set_ydata(amp*np.sin(2*np.pi*freq*t))
    fig.canvas.draw_idle()

sfreq.on_changed(update)
samp.on_changed(update)

但是由于您必须使用 plt.subplots_adjust(bottom=0.3) 在图下方有足够的空间,并且您需要定义 y 方向上的宽度和到轴的距离,我猜您赢不了那么多。

关于python - 将 slider 放在 matplotlib 中子图的正下方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60221884/

相关文章:

python - 使用python的unittest模块出现未绑定(bind)错误

python - Tornado 和 ZeroMQ

python - 格式化其中包含额外花括号的字符串

python - 如何以管理员权限运行 Jupyter notebook?

python - 在 Python 中创建条形图

python - 如何限制 Python 中复杂行的长度?

python - PYTHON-Google Analytics-上传产品数据-THROUGH API

python-3.x - 如何使用 Google Calendar API 创建 "all-day"事件

python - matplotlib 调整颜色条

python - skimage 将 RGB 转换为 HSV 时如何获得正确的颜色。了解色调