import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False # 合并后的数据 before = { 'Total Lines': 12066, 'Source Code Lines': 8701, 'Comment Lines': 1638, 'Blank Lines': 1727, 'Source Code %': 72.1, 'Comment %': 13.6, 'Blank %': 14.3 } after = { 'Total Lines': 23926, 'Source Code Lines': 16122, 'Comment Lines': 5145, 'Blank Lines': 2659, 'Source Code %': 67.4, 'Comment %': 21.5, 'Blank %': 11.1 } # 设置新的配色方案 colors = { 'before': '#2E86AB', # 深蓝色 'after': '#F24236', # 红色 'pie': ['#2E86AB', '#F7B733', '#FC4A1A'] # 饼图配色 } # 图1:柱状图 fig, ax = plt.subplots(figsize=(12, 6)) categories = ['总行数', '代码行数', '注释行数', '空白行数'] before_values = [before['Total Lines'], before['Source Code Lines'], before['Comment Lines'], before['Blank Lines']] after_values = [after['Total Lines'], after['Source Code Lines'], after['Comment Lines'], after['Blank Lines']] x = np.arange(len(categories)) width = 0.35 # 创建柱状图 rects1 = ax.bar(x - width/2, before_values, width, label='维护前', color=colors['before'], alpha=0.8) rects2 = ax.bar(x + width/2, after_values, width, label='维护后', color=colors['after'], alpha=0.8) # 美化 ax.set_ylabel('行数') ax.set_title('代码行数对比') ax.set_xticks(x) ax.set_xticklabels(categories) ax.legend() # 添加数值标签 def autolabel(rects): for rect in rects: height = rect.get_height() ax.annotate(f'{int(height):,}', xy=(rect.get_x() + rect.get_width() / 2, height), xytext=(0, 3), # 3 points vertical offset textcoords="offset points", ha='center', va='bottom') autolabel(rects1) autolabel(rects2) plt.grid(True, axis='y', alpha=0.3) plt.tight_layout() plt.savefig('合并数据柱状图.png', dpi=300, bbox_inches='tight') plt.close() # 图2:饼图对比 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6)) categories_percent = ['代码比例', '注释比例', '空白比例'] before_percent = [before['Source Code %'], before['Comment %'], before['Blank %']] after_percent = [after['Source Code %'], after['Comment %'], after['Blank %']] # 绘制饼图 def make_autopct(values): def my_autopct(pct): total = sum(values) val = int(round(pct*total/100.0)) return f'{pct:.1f}%' return my_autopct ax1.pie(before_percent, labels=categories_percent, colors=colors['pie'], autopct=make_autopct(before_percent), startangle=90) ax1.set_title('维护前') ax2.pie(after_percent, labels=categories_percent, colors=colors['pie'], autopct=make_autopct(after_percent), startangle=90) ax2.set_title('维护后') plt.suptitle('代码构成比例对比') plt.tight_layout() plt.savefig('合并数据饼状图.png', dpi=300, bbox_inches='tight') plt.close()