Поместите ползунок прямо под участок в Matplotlib - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь поместить ползунок прямо под осью X в сюжете matplotlib, чтобы и начало, и конец имели одно и то же значение. Есть ли простой способ сделать это, что означает, что мне не нужно находить правильные координаты и ставить их самостоятельно, когда я создаю plt.axe, содержащий ползунок?

1 Ответ

0 голосов
/ 18 февраля 2020

Вы можете использовать ax.get_position(), чтобы получить x0, y0, ширина and высота` оси и использовать это, чтобы определить позиции для осей ползунков.

Я адаптировал пример matplotlib , чтобы показать пример использования:

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), чтобы иметь достаточно места под графиком, и вам нужно определить ширину и расстояние до ось в направлении у Я думаю, вы не так много выиграете.

...