使用这个matplotlib,需要提前安装好这个绘图工具包。可以在安装好的python环境中安装,也可在jupyter上安装。
今天以绘制时间气温图为例,我们由浅至深统计图的绘制(函数图这里暂时不讲)。
1 最简单的折线图
假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,27,22,18,15]
from matplotlib import pyplot as plt
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
plt.plot(x, y)
plt.show()
输出
2 指定图像大小与刻度
我们希望,能指定生成图像的大小,那么这里可以使用plt.figure()函数,在该函数中指定图像的大小。
plt.figure(figsize=(a, b), dpi=dpi)
figsize 设置图形的大小,a 为图形的宽, b 为图形的高,单位为英寸,dpi 为设置图形每英寸的点数。在plt.figure()后面的命令,都在figure1中,直到下一条figure命令出现,新开启一张图像(figure2)。
由于我们指定x从2到24,所以我们希望横坐标以2位刻度,使用plt.xticks()函数,括号内为可迭代对象。
from matplotlib import pyplot as plt
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 设置图像大小
plt.figure(figsize=(10, 4), dpi=80)
# 10英寸宽,5英寸高,输出分辨率为80(每英寸上可产生的点数)
# 在本程序中,figure函数只出现一次,因此绘制的图形都在figure1中
# 设置x轴的刻度
_xtick_labels = range(2, 26, 2)
plt.xticks(_xtick_labels)
# 绘图
plt.plot(_xtick_labels, y)
plt.show()
输出
同理,也能调整y轴上的刻度,经常使用这个命令:plt.yticks(range(min(y),max(y)+1)),即先筛选出纵坐标的最大值和最小值,然后生成可迭代对象。
3 添加标签与描述信息
如果已知10时-11时之间每分钟的温度,要绘制这段时间的温度变化图,且横坐标边需要每五分钟加显示刻度信息,即如下形式:
要显示刻度描述信息,则需要增加在plt.xticks()添加刻度参数,图中刻度描述信息是斜的,则需设置rotation参数
from matplotlib import pyplot as plt
import random
plt.figure(figsize=(10, 4))
x = range(60)
y = [random.randint(20, 35) for i in range(60)]
# 列表生成式,前面的表达式没有i,那么i仅仅是计数,表示循环生成60次
plt.plot(x, y)
_x_ticks = ["10点{}分".format(i) for i in range(60)]
# 取步长,数字和字符串一一对应,数据的长度一样,才能显示字符串
plt.xticks(x[::5], _x_ticks[::5], rotation=45) # rotation表示字符串的旋转角度
plt.show()
输出
可以看到,图像无法显示中文。
由于matplotlib默认不支持中文字符,默认的英文字体无法显示汉字。如果要显示汉字,可以通过以下两行代码实现:
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
修改后的绘图程序为:
from matplotlib import pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.figure(figsize=(10, 4))
x = range(60)
y = [random.randint(20, 35) for i in range(60)]
# 列表生成式,前面的表达式没有i,那么i仅仅是计数,表示循环生成60次
plt.plot(x, y)
_x_ticks = ["10点{}分".format(i) for i in range(60)]
# 取步长,数字和字符串一一对应,数据的长度一样,才能显示字符串
plt.xticks(x[::5], _x_ticks[::5], rotation=45) # rotation表示字符串的旋转角度
plt.show()
输出
4 添加图片标题,坐标轴标签
在plt.show()之前加上这么几句
plt.xlabel("时间")
plt.ylabel("温度 单位(℃)")
plt.title("10点到12点每分钟的气温变化情况")
输出
5 图像保存
将上述图像保存为“t1.png”,只需执行如下代码:
plt.savefig("./t1.png")
# 如果写成 plt.savefig("./t1.svg") 则保存的为矢量图
需要注意的是,图像保存命令plt.savefig必须用在plt.show前面,否则保存的图像将会是空白,因为plt.show()会将画布刷新
6 练习
假设大家在30岁的时候,根据自己的实际情况,统计出来了从11岁到30岁每年交的女(男)朋友的数量如列表a,请绘制出该数据的折线图,以便分析自己每年交女(男)朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
要求:
y轴表示个数
x轴表示岁数,比如11岁,12岁等
要有坐标轴标签、要有标题,图像保存到程序所在目录,命名为“男女朋友数量.png”。
代码:
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
x = range(11, 31)
plt.figure(figsize=(10, 4))
plt.plot(x, a)
plt.yticks(range(min(a), max(a)+1))
plt.xticks(x)
plt.title("11-30岁每年交的男女朋友数量")
plt.ylabel("单位:个")
plt.xlabel("年龄")
plt.savefig('./男女朋友数量.png')
plt.show()
输出
7 多线条
如果想在一幅图里面显示多条线,该如何?
必须两次调用plt.plot函数,同时指定线条的颜色,线性,宽度,透明度,标签等,并添加图例。
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(11, 31)
plt.figure(figsize=(10, 4))
# label是给线条命名
plt.plot(x, a, color='r', linestyle='--', linewidth=5, label='自己')
plt.plot(x, b, color='g', linestyle='-',
linewidth=3, label='同桌', alpha=0.5)
"""color是颜色,linestyle线型,linewidth线宽,label标签,alpha透明度"""
# 使用legend()自动生成图例,图例自动出现在左上角
# plt.legend()
# 如果不想让图例出现在左上角,可以在legend中插入loc参数
# loc='best'表示图例自动插入在图形中信息比较少的位置
plt.legend(loc='best')
plt.yticks(range(min(a), max(a)+1))
plt.xticks(x)
plt.title("11-30岁每年交的男女朋友数量")
plt.ylabel("单位:个")
plt.xlabel("年龄")
plt.savefig('./男女朋友数量.png')
plt.show()
plt.plot()函数的常用参数如下
颜色属性可以用十六进制数来表示,比如color=‘#00FF00’
输出
7 绘制网格
# 绘制网格
plt.grid(alpha=0.4) # alpha是透明度