设置单选按钮在列表之间切换
Setting Radiobutton to swich between lists
我正在尝试创建一个垂直条等于分数长度的图,并带有一个单选按钮,使用户能够选择分数 he/she 想要查看的级别,如下所示:
按钮 1:显示 John 和 Daniel 在关卡 1 中的得分。
按钮 2:显示 John 和 Daniel 在第 2 关中的得分。
按钮 3:显示 John 和 Daniel 在第 3 关的得分。
... 等等。
如果你运行代码设计思路应该很清楚。
我的一般问题是如何将单选按钮连接到项目的值,在此示例中称为 "level1"、"level2" 和 "level3"(第 19、20 和 21 行) .
作为 scabelon,我只有一个来自 Matplotlib 的颜色转换器(已禁用)。
我尝试了很多谷歌搜索,但只能得出如何设计单选按钮本身的答案,而不是如何将其连接到我的输入。
我希望问题很清楚。谢谢
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
john_level1 = 10
john_level2 = 2
john_level3 = 18
daniel_level1 = 11
daniel_level2 = 0
daniel_level3 = 6
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.35, bottom=0.25)
people = ("John", "Daniel")
y_pos = np.arange(len(people))
level1 = john_level1, daniel_level1
level2 = john_level2, daniel_level2
level3 = john_level3, daniel_level3
plt.axis([0, 12, -1, 2])
axcolor = 'lightgoldenrodyellow'
plt.barh(y_pos, level1, align='center', alpha=0.5)
plt.yticks(y_pos, people)
plt.title('Individuel Points', fontsize=14, fontweight='bold')
#################
# RADIO BUTTONS # Originally a color-changer from Matplotlib
#################
rax = plt.axes([0.015, 0.45, 0.25, 0.25], axisbg=axcolor)
radio = RadioButtons(rax, ('Score at Level 1', 'Score at Level 2', 'Score at Level 3'), active=0)
def raidfunc(label):
# l.set_color(label)
fig.canvas.draw_idle()
radio.on_clicked(raidfunc)
plt.show()
好吧,我想我已经开始工作了。试试这个:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
john_level1 = 10
john_level2 = 2
john_level3 = 18
daniel_level1 = 11
daniel_level2 = 0
daniel_level3 = 6
# plt.subplots_adjust(left=0.35, bottom=0.25)
people = ("John", "Daniel")
y_pos = np.arange(len(people))
level1 = john_level1, daniel_level1
level2 = john_level2, daniel_level2
level3 = john_level3, daniel_level3
fig = plt.figure()
ax = fig.add_subplot(111)
ax.axis([0, 12, -1, 2])
axcolor = 'lightgoldenrodyellow'
ax.barh(y_pos, level1, align='center', alpha=0.5)
ax.set_yticks(y_pos, people)
ax.set_title('Individual Points', fontsize=14, fontweight='bold')
#################
# RADIO BUTTONS # Originally a color-changer from Matplotlib
#################
rax = fig.add_axes([0.015, 0.75, 0.25, 0.25], axisbg=axcolor)
radio = RadioButtons(rax, ('Score at Level 1', 'Score at Level 2', 'Score at Level 3'), active=0)
def raidfunc(label):
if (label == 'Score at Level 1'):
ax.clear()
ax.axis([0, 12, -1, 2])
ax.barh(y_pos, level1, align='center', alpha=0.5)
fig.canvas.draw()
if (label == 'Score at Level 2'):
ax.clear()
ax.axis([0, 12, -1, 2])
ax.barh(y_pos, level2, align='center', alpha=0.5)
fig.canvas.draw()
if (label == 'Score at Level 3'):
ax.clear()
ax.axis([0, 12, -1, 2])
ax.barh(y_pos, level3, align='center', alpha=0.5)
fig.canvas.draw()
radio.on_clicked(raidfunc)
plt.show()
我基本上改变了两件事:
- 使用 fig、ax 和 add_subplot 语法来简化绘图操作
- 有了这个,我可以清除包含你的数据的子图(不会破坏整个图),重新绘制轴(否则它会变得一团糟并用你的数据填充图。我猜你不想要那个) 并重新绘制数据
应该有一个更优雅的解决方案,涉及类似于 set_ydata 的函数,但那个特定的函数似乎不适用于 barh。要点是你应该能够在不重新绘制的情况下做到这一点,这更快,但这似乎有效。至少对我来说。
希望对您有所帮助!
此外,灵感:How to update a plot in matplotlib?
我正在尝试创建一个垂直条等于分数长度的图,并带有一个单选按钮,使用户能够选择分数 he/she 想要查看的级别,如下所示: 按钮 1:显示 John 和 Daniel 在关卡 1 中的得分。 按钮 2:显示 John 和 Daniel 在第 2 关中的得分。 按钮 3:显示 John 和 Daniel 在第 3 关的得分。 ... 等等。 如果你运行代码设计思路应该很清楚。
我的一般问题是如何将单选按钮连接到项目的值,在此示例中称为 "level1"、"level2" 和 "level3"(第 19、20 和 21 行) . 作为 scabelon,我只有一个来自 Matplotlib 的颜色转换器(已禁用)。
我尝试了很多谷歌搜索,但只能得出如何设计单选按钮本身的答案,而不是如何将其连接到我的输入。
我希望问题很清楚。谢谢
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
john_level1 = 10
john_level2 = 2
john_level3 = 18
daniel_level1 = 11
daniel_level2 = 0
daniel_level3 = 6
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.35, bottom=0.25)
people = ("John", "Daniel")
y_pos = np.arange(len(people))
level1 = john_level1, daniel_level1
level2 = john_level2, daniel_level2
level3 = john_level3, daniel_level3
plt.axis([0, 12, -1, 2])
axcolor = 'lightgoldenrodyellow'
plt.barh(y_pos, level1, align='center', alpha=0.5)
plt.yticks(y_pos, people)
plt.title('Individuel Points', fontsize=14, fontweight='bold')
#################
# RADIO BUTTONS # Originally a color-changer from Matplotlib
#################
rax = plt.axes([0.015, 0.45, 0.25, 0.25], axisbg=axcolor)
radio = RadioButtons(rax, ('Score at Level 1', 'Score at Level 2', 'Score at Level 3'), active=0)
def raidfunc(label):
# l.set_color(label)
fig.canvas.draw_idle()
radio.on_clicked(raidfunc)
plt.show()
好吧,我想我已经开始工作了。试试这个:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
john_level1 = 10
john_level2 = 2
john_level3 = 18
daniel_level1 = 11
daniel_level2 = 0
daniel_level3 = 6
# plt.subplots_adjust(left=0.35, bottom=0.25)
people = ("John", "Daniel")
y_pos = np.arange(len(people))
level1 = john_level1, daniel_level1
level2 = john_level2, daniel_level2
level3 = john_level3, daniel_level3
fig = plt.figure()
ax = fig.add_subplot(111)
ax.axis([0, 12, -1, 2])
axcolor = 'lightgoldenrodyellow'
ax.barh(y_pos, level1, align='center', alpha=0.5)
ax.set_yticks(y_pos, people)
ax.set_title('Individual Points', fontsize=14, fontweight='bold')
#################
# RADIO BUTTONS # Originally a color-changer from Matplotlib
#################
rax = fig.add_axes([0.015, 0.75, 0.25, 0.25], axisbg=axcolor)
radio = RadioButtons(rax, ('Score at Level 1', 'Score at Level 2', 'Score at Level 3'), active=0)
def raidfunc(label):
if (label == 'Score at Level 1'):
ax.clear()
ax.axis([0, 12, -1, 2])
ax.barh(y_pos, level1, align='center', alpha=0.5)
fig.canvas.draw()
if (label == 'Score at Level 2'):
ax.clear()
ax.axis([0, 12, -1, 2])
ax.barh(y_pos, level2, align='center', alpha=0.5)
fig.canvas.draw()
if (label == 'Score at Level 3'):
ax.clear()
ax.axis([0, 12, -1, 2])
ax.barh(y_pos, level3, align='center', alpha=0.5)
fig.canvas.draw()
radio.on_clicked(raidfunc)
plt.show()
我基本上改变了两件事:
- 使用 fig、ax 和 add_subplot 语法来简化绘图操作
- 有了这个,我可以清除包含你的数据的子图(不会破坏整个图),重新绘制轴(否则它会变得一团糟并用你的数据填充图。我猜你不想要那个) 并重新绘制数据
应该有一个更优雅的解决方案,涉及类似于 set_ydata 的函数,但那个特定的函数似乎不适用于 barh。要点是你应该能够在不重新绘制的情况下做到这一点,这更快,但这似乎有效。至少对我来说。
希望对您有所帮助!
此外,灵感:How to update a plot in matplotlib?