一、Matplotlib的简单使用
Python底层绘图库,主要做数据可视化图表。
(一)Matplotlib的安装
可通过pip进行安装
pip install matplotlib
(二)简单使用
1、气温实例
假设一天24小时,每间隔2小时统计一次气温,这样就统计了12个气温,假设分别为[12,25,13,6,8,20,23,10,15,8,16,18],通过折线图表示。
from matplotlib import pyplot as plt #导入pyplot x = range(1,25,2) #数据在x轴,是一个可迭代的对象 y = [12,25,13,6,8,20,23,10,15,8,16,18] #数据在y轴,是一个可迭代的对象 plt.plot(x,y) #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.show() #展示图形
这样就展示了图形:
显然,这并不是我们想要的结果,至少坐标轴上的刻度不对呀,这是matplotlib自动为我们生成的,所以我们可以对上面生成的图进行一些设置:
- 设置图片大小、保存图片到本地
from matplotlib import pyplot as plt #导入pyplot plt.figure(figsize=(20,8),dpi=80) #figure指的就是我们画的图,dpi让图片更清晰 x = range(1,25,2) #数据在x轴,是一个可迭代的对象 y = [12,25,13,6,8,20,23,10,15,8,16,18] #数据在y轴,是一个可迭代的对象 plt.plot(x,y) #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.savefig('./page2.png') #保存图片 plt.show() #展示图形
- 调整x、y轴上的刻度
from matplotlib import pyplot as plt #导入pyplot plt.figure(figsize=(20,8),dpi=80) #figure指的就是我们画的图,dpi让图片更清晰 x = range(1,25,2) #数据在x轴,是一个可迭代的对象 y = [12,25,13,6,8,20,23,10,15,8,16,18] #数据在y轴,是一个可迭代的对象 plt.plot(x,y) #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.xticks(x) #修改x刻度 另外也可以自己设置步长 plt.xtickets(x[::2]) plt.yticks(range(1,31)[::5]) ##修改y刻度 另外也可以自己设置步长 # plt.savefig('./page2.png') #保存图片 plt.show() #展示图形
另外如果想让轴上以字符串的形式显示出来,上面这样做还不够,还需要如下的操作:
from matplotlib import pyplot as plt #导入pyplot plt.figure(figsize=(20,8),dpi=80) #figure指的就是我们画的图,dpi让图片更清晰 x = range(1,25,2) #数据在x轴,是一个可迭代的对象 y = [12,25,13,6,8,20,23,10,15,8,16,18] #数据在y轴,是一个可迭代的对象 _x_tickets = ['{}点'.format(i) for i in x] _y_tickets = ['{}℃'.format(i) for i in range(1,31)] plt.plot(x,y) #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.xticks(x,_x_tickets,rotation=45) #注意x,_x_tickets的长度必须保持一致,roration是旋转角度 plt.yticks(range(1,31)[::5],_y_tickets[::5]) #注意y,_y_tickets的长度必须保持一致 # plt.savefig('./page2.png') #保存图片 plt.show() #展示图形
可以看到图中的汉字没有出现:
所以,下一步应该让其显示中文汉字,matplotlib默认不支持中文字符,那么如何修改其默认字符呢?
- 修改默认字符
方法一:通过matplotlib.rc修改
方法二:通过matplotlib下的font_manager进行修改
from matplotlib import pyplot as plt #导入pyplot from matplotlib import font_manager plt.figure(figsize=(20,8),dpi=80) #figure指的就是我们画的图,dpi让图片更清晰 x = range(1,25,2) #数据在x轴,是一个可迭代的对象 y = [12,25,13,6,8,20,23,10,15,8,16,18] #数据在y轴,是一个可迭代的对象 #设置中文字体 my_font = font_manager.FontProperties(fname='C:WindowsFontssimkai.ttf') _x_tickets = ['{}点'.format(i) for i in x] _y_tickets = ['{}℃'.format(i) for i in range(1,31)] plt.plot(x,y) #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.xticks(x,_x_tickets,rotation=45,fontproperties=my_font) #注意x,_x_tickets的长度必须保持一致 plt.yticks(range(1,31)[::5],_y_tickets[::5]) #注意y,_y_tickets的长度必须保持一致 # plt.savefig('./page2.png') #保存图片 plt.show() #展示图形
此时,x轴上就有中文了。
- 给图像添加描述信息
from matplotlib import pyplot as plt #导入pyplot from matplotlib import font_manager #设置中文字体 my_font = font_manager.FontProperties(fname='C:WindowsFontssimkai.ttf') plt.figure(figsize=(20,8),dpi=80) #figure指的就是我们画的图,dpi让图片更清晰 x = range(1,25,2) #数据在x轴,是一个可迭代的对象 plt.xlabel('时间(h)',fontproperties=my_font) y = [12,25,13,6,8,20,23,10,15,8,16,18] #数据在y轴,是一个可迭代的对象 plt.ylabel('温度(℃)',fontproperties=my_font) _x_tickets = ['{}点'.format(i) for i in x] _y_tickets = ['{}℃'.format(i) for i in range(1,31)] plt.title('温度曲线',fontproperties=my_font) plt.plot(x,y) #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.xticks(x,_x_tickets,rotation=45,fontproperties=my_font) #注意x,_x_tickets的长度必须保持一致 plt.yticks(range(1,31)[::5],_y_tickets[::5]) #注意y,_y_tickets的长度必须保持一致 # plt.savefig('./page2.png') #保存图片 plt.show() #展示图形
结果如下:
2、需求升级
如果在上面图中画出两条温度曲线,也就是第二天的温度曲线,这时只需要使用plt再画一次即可,如:
from matplotlib import pyplot as plt #导入pyplot from matplotlib import font_manager #设置中文字体 my_font = font_manager.FontProperties(fname='C:WindowsFontssimkai.ttf') plt.figure(figsize=(20,8),dpi=80) #figure指的就是我们画的图,dpi让图片更清晰 x1 = range(1,25,2) #数据在x轴,是一个可迭代的对象 x2 = range(1,25,2) #数据在x轴,是一个可迭代的对象 plt.xlabel('时间(h)',fontproperties=my_font) y1 = [12,25,13,6,8,20,23,10,15,8,16,18] #数据在y轴,是一个可迭代的对象 y2 = [10,8,10,6,8,10,21,10,11,8,15,9] #数据在y轴,是一个可迭代的对象 plt.ylabel('温度(℃)',fontproperties=my_font) _x1_tickets = ['{}点'.format(i) for i in x1] _y1_tickets = ['{}℃'.format(i) for i in range(1,31)] _x2_tickets = ['{}点'.format(i) for i in x2] _y2_tickets = ['{}℃'.format(i) for i in range(1,31)] plt.title('温度曲线',fontproperties=my_font) plt.plot(x1,y1) #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.plot(x2,y2) #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.xticks(x1,_x1_tickets,rotation=45,fontproperties=my_font) #注意x,_x_tickets的长度必须保持一致 plt.yticks(range(1,31)[::5],_y1_tickets[::5]) #注意y,_y_tickets的长度必须保持一致 plt.xticks(x2,_x2_tickets,rotation=45,fontproperties=my_font) #注意x,_x_tickets的长度必须保持一致 plt.yticks(range(1,31)[::5],_y2_tickets[::5]) #注意y,_y_tickets的长度必须保持一致 # plt.savefig('./page2.png') #保存图片 plt.show() #展示图形
结果如下:
对上面的图中进行属性设置,包括线条颜色、样式、图例等。
from matplotlib import pyplot as plt #导入pyplot from matplotlib import font_manager #设置中文字体 my_font = font_manager.FontProperties(fname='C:WindowsFontssimkai.ttf') plt.figure(figsize=(20,8),dpi=80) #figure指的就是我们画的图,dpi让图片更清晰 x1 = range(1,25,2) #数据在x轴,是一个可迭代的对象 x2 = range(1,25,2) #数据在x轴,是一个可迭代的对象 plt.xlabel('时间(h)',fontproperties=my_font) y1 = [12,25,13,6,8,20,23,10,15,8,16,18] #数据在y轴,是一个可迭代的对象 y2 = [10,8,10,6,8,10,21,10,11,8,15,9] #数据在y轴,是一个可迭代的对象 plt.ylabel('温度(℃)',fontproperties=my_font) _x1_tickets = ['{}点'.format(i) for i in x1] _y1_tickets = ['{}℃'.format(i) for i in range(1,31)] _x2_tickets = ['{}点'.format(i) for i in x2] _y2_tickets = ['{}℃'.format(i) for i in range(1,31)] plt.title('温度曲线',fontproperties=my_font) plt.plot(x1,y1,label='第一天') #传入x,y通过plot进行绘制图形,(1,12),(3,25)... plt.plot(x2,y2,label='第二天',color='red',linestyle='--',linewidth=5,alpha=0.5) #定义样式. plt.xticks(x1,_x1_tickets,rotation=45,fontproperties=my_font) #注意x,_x_tickets的长度必须保持一致 plt.yticks(range(1,31)[::5],_y1_tickets[::5]) #注意y,_y_tickets的长度必须保持一致 plt.xticks(x2,_x2_tickets,rotation=45,fontproperties=my_font) #注意x,_x_tickets的长度必须保持一致 plt.yticks(range(1,31)[::5],_y2_tickets[::5]) #注意y,_y_tickets的长度必须保持一致 # plt.savefig('./page2.png') #保存图片 plt.grid(alpha=0.5) #绘制网格 plt.legend(prop=my_font,loc="upper left") #添加图例 plt.show() #展示图形
结果如下:
二、总结
Matplotlib的学习可参考官方中给的文档:https://matplotlib.org/
在上面简单的实例中,有如下的要点:
- 绘制折线图
plt.plot(x,y)
- 设置图片大小和分辨率
plt.figure(figsize=(20,8),dpi=80)
- 保存图片
plt.savefig('./ex1.png')
- 设置x,y刻度
plt.xticks(x)
plt.yticks(range(1,31)[::5])
- 设置x,y轴标题
plt.xlabel('时间(h)',fontproperties=my_font) plt.ylabel('温度(℃)',fontproperties=my_font)
- 设置字体
#设置中文字体 my_font = font_manager.FontProperties(fname='C:WindowsFontssimkai.ttf')
- 绘制多个图形
多次使用plt.plot方法即可
- 添加图例
plt.legend(prop=my_font,loc="upper left") #添加图例
- 添加网格
plt.grid(alpha=0.5) #绘制网格