如何修改np.histogram直方图的Y轴数据为dots/m²?
解决直方图Y轴从dots/mm²转换为dots/m²的问题
你之前的错误在于误用了np.histogram——这个函数是用来统计数据分布的,你已经通过分组逻辑得到了每个区间的点数num_sizes,并且通过calculate_dots_per_m2算出了转换后的num_of_dots_per_m2,直接用这个数组作为柱状图的高度即可,不需要修改np.histogram的输入参数。
修改后的完整代码
import numpy as np from matplotlib import pyplot as plt color_dict = { "RED": (0, 0, 255), "GREEN": (0, 225, 0), "BLUE": (255, 0, 0), "ORANGE": (0, 165, 255), "MAGENTA": (255, 0, 255) } color_texts = list(color_dict.keys()) colors = list(color_dict.values()) all_areas = [0.01, 0.1, 1, 10, 100] def calculate_dots_per_m2(num_sizes): scale_factor = 25 num_of_dots_per_m2 = [] for i, num_of_defects in enumerate(num_sizes): num_of_dots_per_m2.append(num_of_defects*scale_factor) total_dots_per_m2 = sum(num_of_dots_per_m2) return num_of_dots_per_m2, total_dots_per_m2 def make_histogram(): dots = [[] for i in range(len(all_areas))] all_dot_areas = [0.05, 1.4, 1.5, 1.9, 3.7, 11.5, 29.1, 99.0, 111.1, 4123.1] for dot_area in all_dot_areas: for i, a in enumerate(all_areas[:-1]): if all_areas[i] < dot_area < all_areas[i + 1]: dots[i].append(dot_area) if dot_area > all_areas[-1]: dots[-1].append(dot_area) num_sizes = [len(subls) for subls in dots] num_of_dots_per_m2, total_dots_per_m2 = calculate_dots_per_m2(num_sizes) bins = all_areas + [1e9] # 这里不需要修改np.histogram,因为hist和num_sizes结果一致,我们直接用转换后的num_of_dots_per_m2画图 hist, bin_edges = np.histogram(all_dot_areas, bins) fig, ax = plt.subplots() fig.set_size_inches(16, 9) # 修改Y轴标签为dots/m² ylabel = "Number of dots per m^2" plt.ylabel(ylabel) ticklabels = [] for i, a in enumerate(all_areas[:-1]): # 可选:把标签里的数量也改成dots/m²的数值 size_x_label = "Dots sized {}-{} mm^2: {}".format(all_areas[i], all_areas[i + 1], num_of_dots_per_m2[i]) ticklabels.append(size_x_label) # 同样修改最后一个标签的数值 lastlabel = "Dots with size over {} mm^2: {}".format(all_areas[-1], num_of_dots_per_m2[-1]) ticklabels.append(lastlabel) colours = [c.lower() for c in color_texts] # 把hist替换为num_of_dots_per_m2,用转换后的数值作为柱子高度 ax.bar(range(len(num_of_dots_per_m2)), num_of_dots_per_m2, width=0.75, align="center", tick_label=ticklabels, color=colours, ec="black") plt.show() make_histogram()
关键修改点
- 柱状图的高度数据从
hist替换为num_of_dots_per_m2,直接使用转换后的数值 - 更新Y轴标签为
Number of dots per m^2 - (可选)更新X轴标签中的数量显示,让标签和图表数据保持一致
这样修改后,所有柱状图的高度会变为原来的25倍,X轴的区间划分和描述保持不变,完全符合你的需求。
内容的提问来源于stack exchange,提问作者programer
相关产品推荐
相关产品推荐

