Matplotlib是一个Python的2D绘图库,通过Matplotlib,开发者可以仅需要几行代码,便可以生成折线图,直方图,条形图,饼状图,散点图等。详情可查看Matplotlib库API文档
如果是用Anaconda,可以通过 conda install matplotlib 或者通过 pip install matplotlib 进行安装
plot是一个画图的函数,他的参数为plot([x],y,[fmt],data=None,**kwargs),其中fmt可以传一个字符串,用来给这个图做一些样式修改的。fmt默认的绘制样式是 b- ,也就是蓝色实体线条。其中使用 : 代表点线,是matplotlib的一个缩写。这些缩写还有以下的:
字符 | 类型 | 字符 | 类型 |
---|---|---|---|
‘-’ | 实线 | ‘–’ | 虚线 |
‘-.’ | 虚点线 | ‘:’ | 电线 |
‘.’ | 点 | ‘,’ | 像素点 |
‘o’ | 圆点 | ‘v’ | 下三角点 |
‘^’ | 上三角点 | ‘<’ | 左三角点 |
‘>’ | 右三角点 | ‘1’ | 下三叉点 |
‘2’ | 上三叉点 | ‘3’ | 左三叉点 |
‘4’ | 右三叉点 | ‘s’ | 正方点 |
‘p’ | 五角点 | ‘*’ | 星形点 |
‘h’ | 六边形点1 | ‘H’ | 六边形点2 |
‘+’ | 加号点 | ‘x’ | 乘号点 |
‘D’ | 实心菱形点 | ‘d’ | 瘦菱形点 |
'_'横线点 | ‘’ |
补充:
(1)plt.plot可以只传Y轴的值,如果只传Y轴的值,那么X轴就会默认使用range(0,Y的长度)
(2)plt.plot的x和y参数不能够作为关键字参数来传递,只能作为位置参数来传
(3)plt.plot中的data参数可以为一个字典或者DataFrame对象,然后在x和y上指定这个列的名字,那么plot会自动读取。这里有一个细节,因为x,y,fmt都是在前面,所以如果只传x和y,那么可能会产生歧义,这时候我们可以多传一个空的参数作为fmt的参数,就不会出现警告的情况。
除了设置线条的形状外,我们还可以设置点的颜色。给线条设置颜色总体来说有三种方式,第一种是使用颜色名称(r是red的缩写)的形式,第二种是使用十六进制的方式,第三种是使用RGB或RGBA的方式。如果使用的是颜色名称,那么可以和线的形状卸载同一个字符串中。其中可以表示颜色的缩写字符有如下:
字符 | 颜色 |
---|---|
‘b’ | 蓝色,blue |
‘g’ | 绿色,green |
‘r’ | 红色,red |
‘c’ | 青色,cyan |
‘m’ | 品红,magenta |
‘y’ | 黄色,yellow |
'k’黑色,black | |
‘w’ | 白色,white |
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
y = [np.random.randint(0,10) for x in range(20)]
x = range(5,25)
#不设置横轴的话自动使用range函数从0开始 截止到纵轴点的个数
plt.plot(x,y)
#传递字典
mydata = {
"a":range(5,25),
"b":[np.random.randint(0,10) for x in range(20)]
}
plt.plot("a","b","",data=mydata)
#DataFrame做参数
mydf = pd.DataFrame(data = mydata)
plt.plot("a","b","*",data=mydf)
#设置颜色的三种方式
#将颜色线条设置成红色
plt.plot([1,2,3,4,5],[1,2,3,4,5],'r')
#使用红色的五角点
plt.plot([1,2,3,4,5],[1,2,3,4,5],'rp')
#将颜色设置成红色
plt.plot([1,2,3,4,5],[1,2,3,4,5],color='red')
#将颜色设置成纯黑色
plt.plot([1,2,3,4,5],[1,2,3,4,5],color='#000000')
#颜色设置
plt.plot("a","b","*",data=mydf,color=(0.2,0.3,0.4,1))
import matplotlib.pyplot as plt
import numpy as np
y = [np.random.randint(0,10) for x in range(10)]
#linewidth表示线宽度; aa = True表示开启反锯齿(不会出现锯齿)
plt.plot(y,linewidth=4,color='r',aa = True)
y1 = [np.random.randint(0,10) for x in range(10)]
y2 = [np.random.randint(0,10) for x in range(10)]
#绘制两条折线必须指定x轴
lines = plt.plot(range(10),y1,range(10),y2)
#取其中一条线的Line2D对象
line = lines[0]
line.set_color('r')
line.set_linewidth(5)
#设置透明度
line.set_alpha(0.5)
y1 = [np.random.randint(0,10) for x in range(10)]
y2 = [np.random.randint(0,10) for x in range(10)]
#绘制两条折线必须指定x轴
lines = plt.plot(range(10),y1,range(10),y2)
#两条折线设置线宽为4
plt.setp(lines,linewidth=4)
#加载字体所用的包
from matplotlib import font_manager
#加载字体
font1 = font_manager.FontProperties(fname="C:\Windows\Fonts\simhei.ttf",size=13)
avenger = [17974.4,50918.4,30033.0,40329.1,52567.1,8945,2,6765.2,3452.1,2198.3]
#设置整个图的大小
plt.figure(figsize=(15,5))
font1 = font_manager.FontProperties(fname="C:\Windows\Fonts\simhei.ttf",size=13)
#绘图
plt.plot(avenger)
#设置x轴名称
plt.xlabel("天数",fontproperties=font1)
#设置y轴名称
plt.ylabel("票房(单位:万)",fontproperties=font1)
#显示背景网格
plt.grid(True)
plt.show()
import matplotlib.pyplot as plt
import numpy as np
#加载字体所用的包
from matplotlib import font_manager
y = [np.random.randint(10) for x in range(10)]
#加载字体
font = font_manager.FontProperties(fname="C:\Windows\Fonts\simhei.ttf",size=20)
plt.plot(y)
#设置标题 显示中文需要设置字体
plt.title("折线图",fontproperties = font)
#设置刻度的文本显示
plt.xticks(range(10),["第%d天"%x for x in range(1,11)],fontproperties=font1)
可以通过设置 marker 来实现在一些关键点重点标记出来。
示例:设置 marker 为 o ,这样就是会在(x,y)的坐标点上显示出来,并且显示的是圆点。其中 o 跟 之前的线条样式的简写是一样的。另外,还可以通过 markerfacecolor 属性指定标记点的颜色, markersize 来指定标记点的大小,markeredgecolor 设置标记处图形的边框颜色。代码如下:
import numpy as np
import matplotlib.pyplot as plt
#0-20平均分成50个数
x = np.linspace(0,20,50)
y = np.sin(x)
#设置marker
plt.plot(x,y,marker = 'o',markerfacecolor='r',markersize=10,markeredgecolor='g')
在图形中的某个点标记或者注释一下可以使用 plt.annotate(text,xy,xytext,arrowprops={}) ,来实现,其中 text 是注释文本, xy 是需要注释的点的坐标, xytext 是注释文本的坐标, arrowprops 是设置箭头的样式属性,常用属性如下:
属性 | 说明 |
---|---|
width | (线条)宽度 |
headwidth | 箭头的宽度 |
headlength | 箭头的长度 |
shrink | 箭头与文字、标记点之间的距离,值为0-1之间,小于0.5平均分割 |
facecolor | 箭头颜色 |
edgecolor | 箭头边框颜色 |
plt.plot(np.sin(np.arange(20)),marker='o')
#设置一个点的注释文本
plt.annotate("(0,0)",xy=(0,0),xytext=(-0.5,-0.8),arrowprops={"width":5,"headwidth":16,"headlength":20,"shrink":0.3,"facecolor":'r','edgecolor':'y'})
#设置所有点的注释文本
y = np.sin(np.arange(20))
plt.plot(y,marker='o')
for index,value in enumerate(y):
plt.annotate("(%d,%.2f)"%(index,value),xy=(index,value),xytext=(index-0.1,value-0.1))
调整图片的大小和像素,可以通过 plt.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True) 来实现。其中 num 是图的编号, figure 的单位是英寸, dpi 是每英寸的像素点, facecolor 是图片背景颜色,edgecolor 是边框颜色,frameon代表是否绘制画板。也可以使用 plt.grid() 方式来显示网格
#figure函数的调用必须要在所有绘图之前来完成
#figsize设置画板尺寸(元祖,第一个参数是宽度,第二个餐参数是高度,单位是英寸),facecolor设置画板背景颜色,edgecolor画板边框颜色,linewidth设置画板边框宽度(默认边框宽度为0)
#dpi设置分辨率(默认100),frameon设置画板是否显示(默认为True)
plt.figure(figsize=(10,5),facecolor='r',edgecolor='k',linewidth=5,dpi=200,frameon=True)
plt.plot(np.arange(5,20))
可以调用 plt.savefig(path) 来保存当前的图片或者鼠标左键点击图片然后右键保存图片
#默认不保存画板
plt.savefig("D:/x.png")
绘制多个图有两种形式,第一种形式是在一张图中绘制多根线条,第二种形式是绘制多个子图形。
绘制多根线条,只要准备好坐标,重新使用 plt.plot 绘制即可。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,20,50)
#与plt.plot(x,np.sin(x),x,np.cos(x))效果一致
plt.plot(x,np.sin(x))
plt.plot(x,np.cos(x))
绘制子图的时候,使用 plt.subplot 或 plt.subplots 来实现
其中,subplot 中第一个数字表示这个大图中总共有N行,第二个数字表示总共有M列,然后第三个数字表示当前绘制第X个图。比如 plt.subplot(211) 表示这个大图总共有2行1列,当前绘制第1个图。
values = np.arange(20)
#2行2列第1个图形
plt.subplot(221)
#第一个图形绘制两条折线
plt.plot(values)
plt.plot(values**2)
#2行2列第2个图形
plt.subplot(222)
plt.plot(np.sin(values),'r')
#2行2列第3个图形
plt.subplot(223)
plt.plot(np.cos(values),'b')
#2行2列第4个图形
plt.subplot(224)
plt.plot(np.tan(values),'y')
结果如下图所示:
也可以使用 **fig,axes = plt.subplots(rows,cols,*args,kwargs) 来绘制多个图形,返回值是一个元祖,其中的 fig 参数是 figure 对象, axes 是 axes 对象的 array。效果与之前使用 plt.subplot 一样。
另外使用 subplot 和 subplots 都可以传递 sharex/sharey 参数,这两个参数表示是否需要共享X轴和Y轴。
values = np.linspace(0,20)
#第一个数字代表行,第二个数字代表列,sharex设置共享x轴,sharey共享y轴
fig,axes = plt.subplots(2,2,sharex=True)
ax1 = axes[0,0]
ax1.plot(values)
ax2 = axes[0,1]
ax2.plot(np.sin(values),'y')
ax3 = axes[1,0]
ax3.plot(np.cos(values),c='b')
ax4 = axes[1,1]
ax4.plot(np.tan(values),'g')
matplotlib 图片more内置了几种风格,可以通过 plt.style.available 来查看内置的所有风格。在绘制之前,可以使用 plt.style.use 方法来使用不同的风格。
plt.style.available
#结果为:
#['bmh',
# 'classic',
# 'dark_background',
# 'fast',
# 'fivethirtyeight',
# 'ggplot',
# 'grayscale',
# 'seaborn-bright',
# 'seaborn-colorblind',
# 'seaborn-dark-palette',
# 'seaborn-dark',
# 'seaborn-darkgrid',
# 'seaborn-deep',
# 'seaborn-muted',
# 'seaborn-notebook',
# 'seaborn-paper',
# 'seaborn-pastel',
# 'seaborn-poster',
# 'seaborn-talk',
# 'seaborn-ticks',
# 'seaborn-white',
# 'seaborn-whitegrid',
# 'seaborn',
# 'Solarize_Light2',
# 'tableau-colorblind10',
# '_classic_test']
#绘制之前设置风格
plt.style.use('bmh')