import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = 'SimHei' import matplotlib.pyplot as plt import numpy as np # 数据 risk_levels = ["高风险", "次高风险", "次低风险", "低风险"] material = [41.7, 34.0, 58.3, 36.8] equipment = [16.7, 18.0, 8.3, 10.5] design = [37.5, 38.0, 33.3, 31.6] manufacturing = [4.2, 10.0, 0.0, 21.1] # 设置柱状图位置 x = np.arange(len(risk_levels)) width = 0.6 # 绘制堆叠柱状图 fig, ax = plt.subplots(figsize=(10,6)) bars_material = ax.bar(x, material, width, label="材料", color="#1f77b4") bars_equipment = ax.bar(x, equipment, width, bottom=material, label="设备", color="#ff7f0e") bars_design = ax.bar(x, design, width, bottom=np.array(material)+np.array(equipment), label="设计", color="#2ca02c") bars_manufacturing = ax.bar(x, manufacturing, width, bottom=np.array(material)+np.array(equipment)+np.array(design), label="制造封测", color="#d62728") # 添加柱内比例标签 for i in range(len(x)): # 材料 ax.text(x[i], material[i]/2, f"{material[i]:.1f}%", ha='center', va='center', color='white', fontsize=10) # 设备 ax.text(x[i], material[i]+equipment[i]/2, f"{equipment[i]:.1f}%", ha='center', va='center', color='white', fontsize=10) # 设计 ax.text(x[i], material[i]+equipment[i]+design[i]/2, f"{design[i]:.1f}%", ha='center', va='center', color='white', fontsize=10) # 制造封测 if manufacturing[i] > 0: ax.text(x[i], material[i]+equipment[i]+design[i]+manufacturing[i]/2, f"{manufacturing[i]:.1f}%", ha='center', va='center', color='white', fontsize=10) # 图表美化 ax.set_xticks(x) ax.set_xticklabels(risk_levels) ax.set_ylabel("占比 (%)") ax.set_title("各风险等级企业结构占比(堆叠柱状图)") ax.legend() ax.set_ylim(0, 120) ax.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show()