import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 进价与零售价 basePrice, salePrice = 49, 75 # 计算买num个时的批发价,买的越多,单价越低 def compute(num): return salePrice * (1-0.01*num) # numbers用来存储顾客购买数量 # earns用来存储商场的盈利情况 # totalConsumption用来存储顾客消费总金额 # saves用来存储顾客节省的总金额 numbers = list(range(1, 31)) earns = [] totalConsumption = [] saves = [] # 根据顾客购买数量计算三组数据 for num in numbers: earns.append(round(num*(compute(num)-basePrice), 2)) totalConsumption.append(round(num*compute(num), 2)) saves.append(round(num*(salePrice-compute(num)), 2)) # 绘制商家盈利和顾客节省的折线图,系统自动分配线条颜色 plt.plot(numbers, earns, label='商家盈利') plt.plot(numbers, totalConsumption, label='顾客总消费', ls='-.') plt.plot(numbers, saves, label='顾客节省', lw=3) # 设置坐标轴文本 plt.xlabel('顾客购买数量(件)', fontproperties='simhei') plt.ylabel('金额(元)', fontproperties='simhei') # 设置图形标题 plt.title('数量-金额关系图', fontproperties='stkaiti') # 创建字体,设置图例 myfont = fm.FontProperties(fname=r'C:\Windows\Fonts\STKAITI.ttf') plt.legend(prop=myfont) # 计算并标记商家盈利最多的批发数量 maxEarn = max(earns) bestNumber = numbers[earns.index(maxEarn)] # 散点图,在相应位置绘制一个红色五角星,详见8.3节 plt.scatter([bestNumber], [maxEarn], marker='*', color='red', s=120) # 使用文本标注标记该位置 plt.annotate(xy=(bestNumber, maxEarn), # 箭头终点 xytext=(bestNumber-1, maxEarn+200),# 箭头起点 s=str(maxEarn), # 显示的标注文本 arrowprops=dict(arrowstyle="->")) # 箭头样式 # 显示图形 plt.show()