使用Python Matplotlib结合双列表绘制直方图时遇单调递增错误求解
解决
ValueError: bins must increase monotonically的问题 嘿,这个报错的问题我之前也碰到过!核心原因是你把Y列表直接塞给了hist函数的bins参数,但这个参数要求必须是单调递增的区间数组,而你的Y数据显然不是干这个用的——它是你从文件里读的另一列数值,大概率存在重复或者乱序的情况,所以触发了这个错误。
先理清楚你的需求,分三种常见情况给出解决方案:
情况1:你确实想画X的直方图(统计Time的分布)
直方图的作用是统计一组数据的分布频率,plt.hist()的第二个参数bins是用来指定统计区间的,不是另一列数据。你可以让matplotlib自动计算合适的区间,或者手动定义单调递增的区间:
import matplotlib.pyplot as plt import numpy as np X, Y = [], [] for line in open('data_simple.txt', 'r'): values = [float(s) for s in line.split()] X.append(values[0]) Y.append(values[1]) # 方案A:让matplotlib自动计算bins(最省心) n, bins, patches = plt.hist(X, facecolor='g', alpha=0.75) # 方案B:手动定义单调递增的区间,比如把X的范围分成10组 # bins = np.linspace(min(X), max(X), 10) # n, bins, patches = plt.hist(X, bins=bins, facecolor='g', alpha=0.75) plt.xlabel('Time') plt.ylabel('Frequency') # 直方图的y轴是数据出现的频率/次数 plt.show()
情况2:你其实想画柱状图(展示不同Time对应的Core数量)
如果你的需求是展示每个Time点对应的Core数量,那你应该用柱状图plt.bar(),而不是直方图:
import matplotlib.pyplot as plt import numpy as np X, Y = [], [] for line in open('data_simple.txt', 'r'): values = [float(s) for s in line.split()] X.append(values[0]) Y.append(values[1]) # 绘制柱状图 plt.bar(X, Y, facecolor='g', alpha=0.75) plt.xlabel('Time') plt.ylabel('Num of Cores') plt.show()
情况3:按Core数量分组,统计每组Time的分布
如果你的需求是把X(Time)按Y(Core数量)分组,然后分别画每组的直方图,可以这样做:
import matplotlib.pyplot as plt import numpy as np from collections import defaultdict X, Y = [], [] for line in open('data_simple.txt', 'r'): values = [float(s) for s in line.split()] X.append(values[0]) Y.append(values[1]) # 按Core数量分组Time数据 core_groups = defaultdict(list) for time, core_num in zip(X, Y): core_groups[core_num].append(time) # 为每组绘制直方图,添加图例区分 for core, times in core_groups.items(): plt.hist(times, label=f'Cores: {int(core)}', alpha=0.5) plt.xlabel('Time') plt.ylabel('Frequency') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Zeeshan Hayat
相关产品推荐
相关产品推荐

