Python实现掷两个骰子总和动态可视化 遇ValueError问题求解
掷2个骰子点数和频率动态可视化修改方案
你遇到的ValueError: Grouper for not 1-dimensional错误主要来自两个核心问题:一是新版seaborn的sns.barplot()不再支持无关键字的位置参数传值,必须显式指定x、y参数;二是原有单骰子的计数、取值逻辑没有适配双骰子和的取值范围。
具体修改点
- 调整取值范围:双骰子点数和区间为2~12,共11种可能结果,因此
values改为list(range(2, 13)),计数列表frequencies初始化为11个0的列表 - 修正掷骰子计数逻辑:每次生成两个1~6的随机数求和,对应计数索引为「点数和 - 2」(最小和为2,对应索引0)
- 显式指定sns.barplot的参数:避免位置参数匹配错误
- 修正坐标轴标题、x轴刻度逻辑适配双骰子场景
完整可运行代码
"""动态绘制2个骰子点数和的出现频率""" from matplotlib import animation import matplotlib.pyplot as plt import random import seaborn as sns def update(frame_number, rolls, faces, frequencies): """每一帧动画的柱状图更新逻辑""" # 掷骰子并更新频率计数 for i in range(rolls): dice1 = random.randrange(1, 7) dice2 = random.randrange(1, 7) sum_val = dice1 + dice2 frequencies[sum_val - 2] += 1 # 清空旧图并绘制新的柱状图 plt.cla() # 显式指定x和y参数,避免位置参数报错 axes = sns.barplot(x=frequencies, y=faces, palette='bright', orient='horizontal') axes.set_title(f'2个骰子点数和频率统计,总掷出次数:{sum(frequencies):,}次') axes.set(xlabel='出现次数', ylabel='骰子点数和') # x轴最大刻度比最高频率多10%,留出显示文本的空间 axes.set_xlim(right=max(frequencies) * 1.10 if max(frequencies) >0 else 10) # 在每个条形右侧显示次数和占比 for bar, frequency in zip(axes.patches, frequencies): text_x = bar.get_width() text_y = bar.get_y() + bar.get_height() / 2.0 text = f'{frequency:,}\n{frequency / sum(frequencies):.3%}' if sum(frequencies) >0 else "0\n0.000%" axes.text(text_x, text_y, text, ha='left', va='center') # 动画参数配置 number_of_frames = 200 # 总动画帧数 rolls_per_frame = 100 # 每帧新增掷骰子次数 sns.set_style('whitegrid') figure = plt.figure('掷2个六面骰子频率统计') values = list(range(2, 13)) # y轴显示的点数和区间2~12 frequencies = [0] * 11 # 11个取值对应的初始计数 # 启动动画 die_animation = animation.FuncAnimation( figure, update, repeat=False, frames=number_of_frames, interval=33, fargs=(rolls_per_frame, values, frequencies)) plt.show()
内容的提问来源于stack exchange,提问作者user12881277
相关产品推荐
相关产品推荐

