第三节课Matplotlib作业
练习1: 散点图寻找最佳赢利点
为了对某一产品进行合理定价,我们对此类商品进行了试销实验,价格与需求量数据如下。利用图表分析规律。

price = [60,80,40,30,70,90,95]
sales = [100,50,120,135,65,45,40]
示例示例
# !/usr/bin/python
# Filename: 散点图作业一.py
# Data : 2021/01/06
# Author : --king--
# ctrl+alt+L自动加空格格式化
# 为了对某一产品进行合理定价,我们对此类商品进行了试销实验,价格与需求量数据如下。利用图表分析规律。
# price = [60,80,40,30,70,90,95]
# sales = [100,50,120,135,65,45,40]
from matplotlib import pyplot as plt
# 注意FontProperties首字母大写
from matplotlib.font_manager import FontProperties
# 设置字体
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=10)
x = [60,80,40,30,70,90,95]
y = [100,50,120,135,65,45,40]
# 如果需要找到需求随价格变化的规律,那么令price为x轴,sales为y轴
plt.scatter(x,y,marker='*',color='purple')
# 定义X轴刻度和刻度标签
x_t = range(0,int(max(x)+10))[::10]
x_l = ['{}元'.format(i) for i in x_t]
plt.xticks(x_t,x_l,fontproperties=font)
# 定义x轴标签
plt.xlabel('价格',fontproperties=font)
# 定义y轴刻度
y_t = range(0,int(max(y)+10))[::10]
y_l = [i for i in y_t]
plt.yticks(y_t,y_l)
# 定义y轴标签
plt.ylabel('需求量',fontproperties=font)
# 定义一个空列表z
z = []
# 定义点的坐标值,用zip打包(x,y)形成对应的坐标
# 用for a,b in zip(x,y)实现解包
for a,b in zip(x,y):
# print(a,b)
# 通过plt.text()绘制点的值,前两个参数是值的坐标,可以进行加减改变位置
# center垂直居中显示,bottom水平靠下显示
plt.text(a,b-6,s=(a,b),ha='center',va='bottom',fontsize=8)
# 分析数据
# 商家必然会追求最大利润
z.append(a*b)
# 创建图例
plt.legend(['价格供需变化'],prop=font)
# 设置图表标题
plt.title('价格供需变化图',fontproperties=font,color='red',fontsize=12)
for i in range(7):
if x[i]*y[i] == max(z):
print('商家应当选择价格为{}需求量为{}的产品。'.format(x[i],y[i]))
# 添加网格
plt.grid()
# 显示绘图结果
plt.show()
输出结果展示:
- 价格供需变化图

- 最佳赢利点分析结果

练习2: 条状图对比电影票房
- 电影数据如下:
movies_name = [“变身特工”,“美丽人生”,“鲨海逃生”,“熊出没·狂野大陆”]
day_12 = [2358,399,2358,362]
day_13 = [12357,156,2045,168]
day_14 = [15746,312,4497,319]
需求:
• 直观体现出不同电影近三天的票房的对比情况
代码示例:
# !/usr/bin/python
# Filename: 条状图作业一.py
# Data : 2021/01/06
# Author : --king--
# ctrl+alt+L自动加空格格式化
# 电影数据如下:
# movies_name = ["变身特工","美丽人生","鲨海逃生","熊出没·狂野大陆"]
# day_12 = [2358,399,2358,362]
# day_13 = [12357,156,2045,168]
# day_14 = [15746,312,4497,319]
# 需求:
# • 直观体现出不同电影近三天的票房的对比情况
from matplotlib import pyplot as plt
# 注意FontProperties首字母大写
from matplotlib.font_manager import FontProperties
# 设置字体
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=10)
movies_name = ["变身特工","美丽人生","鲨海逃生","熊出没·狂野大陆"]
day_12 = [2358,399,2358,362]
day_13 = [12357,156,2045,168]
day_14 = [15746,312,4497,319]
# 设定条状图宽度
width=0.3
# 定义柱子颜色
# color=['r','g','b']
# 设定x轴
d_1 = [i - width for i in range(len(day_12))]
d_2 = range(len(day_13))
d_3 = [i + width for i in range(len(day_14))]
plt.bar(d_1,day_12,width=width,align='center',orientation='vertical',color='r')
plt.bar(d_2,day_13,width=width,align='center',orientation='vertical',color='g')
plt.bar(d_3,day_14,width=width,align='center',orientation='vertical',color='b')
# 设置x轴刻度和刻度标签
plt.xticks(range(len(day_12)),movies_name,fontproperties=font)
# 设置x轴标签
plt.xlabel('电影名称',fontproperties=font,fontsize=12)
# 设置y轴的标签
plt.ylabel('票房',fontproperties=font,fontsize=12)
# 设置柱子顶部的值
def bar_mark(d_num,day_num):
for a,b in zip(d_num,day_num):
plt.text(a,b+5,s=b,ha='center',va='bottom',fontsize=8)
bar_mark(d_1,day_12)
bar_mark(d_2,day_13)
bar_mark(d_3,day_14)
# 增加图例
# 注意汉字支持使用prop字段
plt.legend(['12日票房','13日票房','14日票房'],prop=font)
# 设置图标标题
plt.title('电影票房对比表',fontproperties=font,fontsize=15,fontweight='bold',backgroundcolor='gold',alpha=0.8)
plt.show()
输出结果展示:
- 电影票房对比表

需要注意的部分:
1. text函数
‘’’
plt.text(x, y, s, fontsize, verticalalignment,horizontalalignment,rotation , **kwargs)
参数:
x,y表示标签添加的位置,默认是根据坐标轴的数据来度量的,是绝对值,也就是说图中点所在位置的对应的值,特别的,如果你要变换坐标系的话,要用到transform=ax.transAxes参数。
s表示标签的符号,字符串格式,比如你想加个“我爱三行科创”,更多的是你标注跟数据有关的主体,你如实写便是。
fontsize顾名思义就是你加标签字体大小了,取整数。
verticalalignment表示垂直对齐方式 ,可选 ‘center’ ,‘top’ , ‘bottom’,‘baseline’ 等
horizontalalignment表示水平对齐方式 ,可以填 ‘center’ , ‘right’ ,‘left’ 等
rotation表示标签的旋转角度,以逆时针计算,取整
后面还有 family 用来设置字体,style 设置字体的风格,weight 字体的粗细, bbox 给字体添加框,如 bbox=dict(facecolor=‘red’, alpha=0.5) 等
‘’’
2. arrow函数
‘’’
matplotlib.pyplot.arrow(
x, y, dx, dy,
hold=None, **kwargs)
参数:
x, y : 箭头起点坐标
dx, dy : 箭头x上的长度和y轴上的长度
width: 箭头宽度,默认0.001
length_includes_head: bool,箭"头"是否包含在长度之中 默认False
head_width: float,箭"头"的宽度,默认: 3*width
head_length: float 箭"头"的长度,默认1.5 * head_width
shape: [‘full’, ‘left’, ‘right’],箭头形状, 默认 ‘full’
overhang: float (default: 0)
head_starts_at_zero: bool (default: False)开始坐标是否是0
返回值
FancyArrow
‘’’
3. 一些小知识
- 绘制第二个数据的时候把bottom设置为第一个数据的值即可
- round()可以四舍五入
- plt.savefig() 可以保存图形
- plt.legend()可以直接添加列表作为图例,也可以通过在绘图时设定label='图例内容‘,然后plt.legend()自动生成图例