matplotlib是受MATLAB的启发构建的。matplotlib.pyplot模块中有一套完全仿照MATLAB的函数形式的绘图接口,这套函数接口方便MATLAB用户过度到matplotlib包。
本篇文章是博主在B站学习总结,写了一天,讲述matplotlib绘图技巧,干货加实例,并附代码、运行图,希望对大家有所帮助。
引例:
每天温度数据如下,[15, 12.2, 14, 14, 34, 43, 23, 34, 11.5, 22, 23, 12],利用pyplot绘制折线图。
代码如下:
from matplotlib import pyplot as plt
x = range(2, 26, 2)
y = [15, 12.2, 14, 14, 34, 43, 23, 34, 11.5, 22, 23, 12]
plt.plot(x, y)
plt.show()
展示如下:
可以看到,上图十分简洁,大致达到了初学者希望绘制图片的期望。但是,我们希望能够增加对这幅图的描述信息,并且让图片更美观。
1. 设置图片大小(高清无码大图)并保存到本地
from matplotlib import pyplot as plt
#设置图片大小
#figsize=(长度,高度), dpi=每单位的像素点
fig = plt.figure(figsize=(20,8), dpi=80)
x = range(2, 26, 2)
y = [15, 12.2, 14, 14, 34, 43, 23, 34, 11.5, 22, 23, 12]
#绘图
plt.plot(x, y)
#保存本地-设置.png防止放大失真
plt.savefig("./t1.png")
#展示图形
plt.show()
2. 描述信息,如x轴和y轴表示含义,以及图表标题含义。
from matplotlib import pyplot as plt
import random
y = [random.randint(20, 35) for i in range(120)]
x = range(120)
fig = plt.figure(figsize=(16,6),dpi=80)
##调整x轴刻度并添加汉字解释
_xticks_lable = ["10点{}分".format(i) for i in range(60)]
_xticks_lable += ["11点{}分".format(i) for i in range(60)]
#取步长,数据与字符串一一对应
plt.xticks(list(x)[::3], _xticks_lable[::3], rotation=45)#字符串旋转45度
plt.yticks(y)
plt.plot(x,y)
plt.show()
运行之后,如图,发现x坐标轴没有显示汉字,而是方框。这是由于matplotlib默认字体没有汉字,需要我们自己修改默认设置才可以。
这里博主推荐一篇matplotlib修改默认字体的文章,博主用的方法一,亲测有效。
https://blog.csdn.net/mp9105/article/details/90213711
修改之后的代码(添加了x轴,y轴的描述信息,标题)如下:
from matplotlib import pyplot as plt
from matplotlib import font_manager#设置字体
import random
# 使用my_font存出一个加载的中文字体
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')
y = [random.randint(20, 35) for i in range(120)]
x = range(120)
fig = plt.figure(figsize=(16,6),dpi=80)
##调整x轴刻度并添加汉字解释
_xticks_lable = ["10点{}分".format(i) for i in range(60)]
_xticks_lable += ["11点{}分".format(i) for i in range(60)]
#取步长,数据与字符串一一对应
plt.xticks(list(x)[::3], _xticks_lable[::3], rotation=45, fontproperties=my_font)#字符串旋转45度
#添加描述信息
plt.xlabel("时间 单位(min)", fontproperties=my_font)
plt.ylabel("温度 单位(C)", fontproperties=my_font)
plt.title("10点到12点每分钟气温变化", fontproperties=my_font)
##绘制网格,横竖线根据x,y坐标轴数目
plt.grid(alpha=0.5)#alpha设置网格透明度
plt.plot(x,y)
plt.show()
3. 线条的样式(比如颜色、透明度、图例等)
##绘制两条折线并添加图例
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 使用my_font存出一个加载的中文字体
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')
x = range(11, 31)
y1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
##设置x轴
x_labels=["{}岁".format(i) for i in range(11,31)]
plt.xticks(list(x), x_labels,rotation=45, fontproperties=my_font)
##详细信息
plt.xlabel("年龄", fontproperties=my_font)
plt.title("数目随年龄变化曲线", fontproperties=my_font)
##绘制网格,横竖线根据x,y坐标轴数目
plt.grid(alpha=0.5, linestyle=":")#alpha设置网格透明度,linestyle设置线条样式点状
#绘制图形,设置线条样式
plt.plot(x, y1, label="小明", color="red", linestyle="--")
plt.plot(x, y2, label="小红", linewidth=3, alpha=0.5)
#添加图例,不能使用fontproperties
plt.legend(loc="best",prop=my_font)#loc调整显示位置,prop设置字体
plt.show()
4. 标记出特殊的点(比如最高点和最低点在哪里)
假设最高点为(23,6),添加代码语句如下:
#添加最高点
plt.text(23,6, "max", color="r")#前面表示图中实际坐标,中间是标注的内容,最后是颜色信息
5. 给图片添加一个水印(防止盗用)
#加图水印
from __future__ import print_function
import numpy as np
import matplotlib.cbook as cbook
import matplotlib.image as image
import matplotlib.pyplot as plt
# Fixing random state for reproducibility
np.random.seed(1996)
datafile = cbook.get_sample_data('logo.png', asfileobj=False)
print('loading %s' % datafile)
im = image.imread(datafile)
im[:, :, -1] = 0.5 # set the alpha channel
fig, ax = plt.subplots()
ax.plot(np.random.rand(20), '-o', ms=20, lw=2, alpha=0.7, mfc='orange')
ax.grid()
fig.figimage(im, 5, 5, zorder=3)
plt.show()