一, 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:\Windows\Fonts\simkai.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:\Windows\Fonts\simkai.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:\Windows\Fonts\simkai.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:\Windows\Fonts\simkai.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:\Windows\Fonts\simkai.ttf')
绘制多个图形
多次使用 plt.plot 方法即可
添加图例
plt.legend(prop=my_font,loc="upper left") #添加图例
添加网格
plt.grid(alpha=0.5) #绘制网格
来源: http://www.bubuko.com/infodetail-3365651.html