Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。
Matplotlib提供了一个套面向绘图对象编程的API接口,能够很轻松地实现各种图像的绘制,并且它可以配合Python GUI工具(如 PyQt、Tkinter 等)在应用程序中嵌入图形。同时 Matplotlib 也支持以脚本的形式嵌入到 IPython shell、Jupyter 笔记本、web 应用服务器中使用。
matplotlib框架分为三层,这三层构成了一个栈,上层可以调用下层。
主要用于可视化编程,pytplot模块可以提供给我们一个与matplotlib打交道的接口。可以只通过调用pyplot模块的函数从而操作整个程序包,来绘制图形。
图形中所有能看到的元素都属于Artist对象,即标题、轴标签、刻度等组成图形的所有元素都是Artist对象的实例。
一个figure(图)可以包含多个axes(坐标系),但是一个axes只能属于一个figure。一个axes(坐标系)可以包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系。
matplotlib的底层,实现了大量的抽象接口类,这些API用来在底层实现图形元素的一个个类。
通过Pyplot 对数据进行图形化展示,可以直观的了解数据的分布情况,更好的制定出学习方法。同时,它还可以展示出我们机器学习到的计算方法,了解其与实际情况是否相符等问题。
Pyplot 绘图流程如下:
Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改
plot()
:用于绘制线图和散点图scatter()
:用于绘制散点图bar()
:用于绘制垂直条形图和水平条形图hist()
:用于绘制直方图pie()
:用于绘制饼图imshow()
:用于绘制图像subplots()
:用于创建子图plt.plot(x,y,format_string,**kwargs)
`plt.plot()`函数是Matplotlib库中用于绘制线条图的函数,它有多个参数可以控制绘图的各个方面。以下是常用的一些参数:
'-'
: 实线
'--'
: 虚线
'-.'
: 点划线
':'
: 点线
''
: 无线条,只显示标记
'None'
: 无线条,不显示标记
' '
: 无线条,不显示标记
'.': 小圆点
',': 像素点
'o': 实心圆
'v': 垂直三角形
'^': 正三角形
'<': 左三角形
'>': 右三角形
'1': 向下平行竖线
'2': 向上平行竖线
'3': 向左平行横线
'4': 向右平行横线
's': 正方形
'p': 五边形
'*': 星号
'h': 六边形1
'H': 六边形2
'+': 加号
'x': X号
'd': 小菱形
'D': 大菱形
'|': 竖线
'_': 横线
还有一些其他参数:
`plt.plot()`函数的参数比较多,不同的参数组合可以实现各种各样的效果。
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
plt.bar参数说明
bar(x, height, width=0.8, bottom=None, ***, align='center', data=None, **kwargs)
matplotlib.pyplot.hist(
x, bins=10, range=None, normed=False,
weights=None, cumulative=False, bottom=None,
histtype=u'bar', align=u'mid', orientation=u'vertical',
rwidth=None, log=False, color=None, label=None, stacked=False,
hold=None, **kwargs)
pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None)
matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None,extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, data=None, **kwargs)
X:图像数据。支持的数组形状是:
image.cmap
。norm :~matplotlib.colors.Normalize,如果使用scalar data ,则Normalize会对其进行缩放[0,1]的数据值内。默认情况下,数据范围使用线性缩放映射到颜色条范围。 RGB(A)数据忽略该参数。
aspect:{'equal','auto'}或float,可选,控制轴的纵横比。该参数可能使图像失真,即像素不是方形的。equal:确保宽高比为1,像素将为正方形。(除非像素大小明确地在数据中变为非正方形,坐标使用 extent )。auto: 更改图像宽高比以匹配轴的宽高比。通常,这将导致非方形像素。
interpolation:str,使用的插值方法,支持的值有:'none', 'nearest', 'bilinear', 'bicubic','spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser','quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc','lanczos'.如果interpolation = 'none',则不执行插值
alpha:alpha值,介于0(透明)和1(不透明)之间。RGBA输入数据忽略此参数。
extent:(left, right, bottom, top)数据坐标中左下角和右上角的位置。 如果为“无”,则定位图像使得像素中心落在基于零的(行,列)索引上。
subplots参数说明
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
1.True或者'all':x或y轴属性将在所有子图(subplots)中共享.
2.False或'none':每个子图的x或y轴都是独立的部分
3.'row':每个子图在一个x或y轴共享行(row)
4.'col':每个子图在一个x或y轴共享列(column)当子图在x轴有一个共享列时('col'),只有底部子图的x tick标记是可视的。同理,当子图在y轴有一个共享行时('row'),只有第一列子图的y tick标记是可视的。
如果是True,额外的维度从返回的Axes(轴)对象中挤出。
如果只有一个子图被构建(nrows=ncols=1),结果是单个Axes对象作为标量被返回。
对于N*1或1*N个子图,返回一个1维数组。
对于N*M,N>1和M>1返回一个2维数组。
如果是False,不进行挤压操作:返回一个元素为Axes实例的2维数组,即使它最终是1x1。
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
我们为plot命令提供了一个list或者是array,matplotlib认为这个序列是Y轴上的取值,并且会自动生成X轴上的值。因为python中的范围是从0开始的,因此X轴就是从0开始,长度与Y的长度相同,也就是[0,1,2,3],所以显示如下:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.ylabel('some numbers')
plt.show()
plot的参数可以是任意数量,上面参数表示的是(x,y)对,(1,1)(2,4)(3,9)(4,16)。这里有第三个可选参数,它是字符串格式的,表示颜色和线的类型。它是颜色字符串和线的类型字符串的组合。默认情况下,该字符串参数是’b-‘,表示蓝色的实线。显示如下:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')
plt.axis([0, 6, 0, 20])
plt.show()
'ro'表示红色圆圈绘制上述点集,显示如下:
import numpy as np
import matplotlib.pyplot as plt
# 0到5之间每隔0.2取一个数
t = np.arange(0., 5., 0.2)
# 红色的破折号,蓝色的方块,绿色的三角形
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
构建三组numpy数据,通过不同的样式展示出来,显示如下:
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.figure("2subplot")
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
plt.show()
pyplot所有的绘图命令都是应用于当前图形(figure)和当前坐标系(axes),分别在两个坐标系绘制一个图形,显示如下:
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# 直方图
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
text()命令可以被用来在任何位置添加文字,xlabel()、ylabel()、title()被用来在指定位置添加文字。所有text()命令返回一个matplotlib.text.Text实例,可以通过关键字参数在text()定制文本样式,也可以通过setp()来定制文字的样式:
t = plt.xlabel('my data', fontsize=14, color='red')
setp(t,color='blue')
annotate()方法添加注释,有两点需要注意:需要被注释的地方,使用xy参数来指出,还有就是注释文本所放置的位置,使用参数xytext来指定位置,这两个参数都使(x,y)元组:
这里的xy和xytext所使用的坐标是根据XY轴的刻度的坐标,称为data coordinates。
import numpy as np
import matplotlib.pyplot as plt
# 在区间[0,1]制造一些数据
# np.random.normal为高斯分布
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))
# 创建一个窗口
plt.figure(1)
# 线性
plt.subplot(221)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)
# 对数
plt.subplot(222)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)
# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.05)
plt.title('symlog')
plt.grid(True)
# logit
plt.subplot(224)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)
plt.show()
matplotlib.pylot不仅仅提供了线性的坐标,还提供了对数(logarithmic)和分对数(logit)坐标。当数据的维度跨越许多数量级时,这种坐标就很有用
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
x = np.random.randn(50)
y = np.random.randn(50)
color = np.random.rand(50)
changecolor = colors.Normalize(vmin=0.4, vmax=0.8)
plt.scatter(x, y, c=color, s=60, alpha=0.3, cmap='viridis',norm=changecolor)
plt.colorbar() # 显示颜色条
plt.show()
参数 vmin、vmax 分别为要设置的数据范围的最小值和最大值(注意:设置之后,原来大于vmax的值被“拉低”成vmax;原来小于vmin的值被“拉高”成vmin)
class matplotlib.colors.Normalize(vmin=None, vmax=None)
import matplotlib.pyplot as plt
#定义饼的标签,
labels = ['one','two','three','four','five','other']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
#饼图分离
explode = (0.03,0.05,0.06,0.04,0.08,0.1)
#设置阴影效果
#plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode,shadow=True)
plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode, labeldistance=1.35, pctdistance=1.2)
plt.legend()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 将全局的字体设置为黑体
matplotlib.rcParams['font.family'] = 'SimHei'
# 数据
N = 5
y = [20, 10, 30, 25, 15]
x = np.arange(N)
# 绘图 x x轴, height 高度, 默认:color="blue", width=0.8
p1 = plt.bar(x, height=y, width=0.5, )
# 展示图形
plt.show()
"""
水平条形图,需要修改以下属性
orientation="horizontal"
"""
import numpy as np
import matplotlib.pyplot as plt
# 数据
N = 5
x = [20, 10, 30, 25, 15]
y = np.arange(N)
# 绘图 x= 起始位置, bottom= 水平条的底部(左侧), y轴, height 水平条的宽度, width 水平条的长度
p1 = plt.bar(x=0, bottom=y, height=0.5, width=x, orientation="horizontal")
# 展示图形
plt.show()
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(3, 3, figsize=(6,6))
fig.text(0.5, 0, 'x', ha='center')
fig.text(0, 0.5, 'y', va='center')
x = np.linspace(0, 2*np.pi, 50, endpoint=False)
sins = np.sin(x)
coss = np.cos(x)
ax[1][1].plot(x, sins, 'r', alpha=0.5, lw=0.5, ls='-', marker='+', label='sin')
ax2 = ax[1][1].twinx()
ax2.plot(x, coss, 'g', alpha=0.5, lw=0.5, ls='-', marker='+', label='cos')
for tl in ax2.get_yticklabels():
tl.set_color("r")
plt.tight_layout()
plt.show()
import random
import time
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"] # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False # 设置正常显示符号
x = range(1, 101)
times = [random.randint(10, 200) for i in range(100)]
plt.figure(figsize=(15, 5), dpi=80) # 创建画布
plt.plot(x, times, color='r', linestyle='-', label='t = 2', marker='v') # 绘制折线图,点划线
plt.legend(loc=0) # 显示图例
# 描述信息
plt.xlabel("设备数/个")
plt.ylabel("时间/s")
plt.title("时间变化图", fontsize=18)
plt.savefig("./time.jpg") # 保存至指定位置
plt.show() # 显示图像