三剑客之Matplotlib
matplotlib 是 python 中最著名的绘图库。它提供了一套类似于Matlab的命令API,非常适合交互式绘图。它还可以很容易地用作绘图控件,嵌入到 GUI 应用程序中。 matplotlib 可以绘制各种形式的图形,包括普通的折线图、直方图、饼图、散点图和误差条图等。方便自定义图形的各种属性,如线型、颜色、粗细、字体。可以很好地支持一些TeX 排版命令,并能以图形精美地显示数学公式。
更多Matplotlib的相关知识,可以参考这篇文章:《
》
3.1 pylot介绍
Matplotlib包含了matlab、mathtext、finance、dates等几十个不同的模块,而pylot是我们最常用的绘图模块,也是本文的重点。
3.1.1 中文显示问题的解决方案
解决这个问题的方法有很多,但是下面的方法可能是最简单的解决方法(我只在windows平台上测试过,其他平台请看官方自测)。如果想了解更多,也可以参考我N年前的博文:
>>> import matplotlib.pyplot as plt
>>> plt.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
>>> plt.rcParams['axes.unicode_minus'] = False # 解决保存图像时'-'显示为方块的问题
3.1.2 绘制最简单的图形
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.arange(0, 2*np.pi, 0.01)
>>> y = np.sin(x)
>>> plt.plot(x, y)
>>> plt.show()
3.1.3 设置标题、坐标轴名称、坐标轴范围
如果在python shell中运行以下代码,而shell的默认编码不是utf-8,中文可能仍然显示为乱码。你可以尝试将 u'sine curve' 写为 'sine curve'.decode('gbk') 或 'sine curve'.decode('utf-8')
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from pylab import mpl
>>> mpl.rcParams['font.sans-serif'] = ['FangSong']
>>> mpl.rcParams['axes.unicode_minus'] = False
>>> x = np.arange(0, 2*np.pi, 0.01)
>>> y = np.sin(x)
>>> plt.plot(x, y)
>>> plt.title(u'正弦曲线', fontdict={'size':20}) # 设置标题
>>> plt.xlabel(u'弧度', fontdict={'size':16}) # 显示横轴名称
>>> plt.ylabel(u'正弦值', fontdict={'size':16}) # 显示纵轴名称
>>> plt.axis([-0.1*np.pi, 2.1*np.pi, -1.1, 1.1]) # 设置坐标轴范围
>>> plt.axis('equal') # xy轴等比例保持
>>> plt.show()
3.1.4 设置点和线的样式、宽度、颜色
plt.plot函数的调用形式如下:
plot(x, y, color='green', linestyle='dashed', linewidth=1, marker='o', markerfacecolor='blue', markersize=6)
plot(x, y, c='g', ls='--', lw=1, marker='o', mfc='blue', ms=6)
1、color指定线的颜色,可简写为“c”。颜色的选项为:
·
蓝色: ‘b’ (blue)
·
绿色: ‘g’ (green)
·
红色: ‘r’ (red)
·
墨绿: ‘c’ (cyan)
·
洋红: ‘m’ (magenta)
·
黄色: ‘y’ (yellow)
·
黑色: ‘k’ (black)
·
白色: ‘w’ (white)
·
灰度表示: e.g. 0.75 ([0,1]内任意浮点数)
·
RGB表示法: e.g. ‘#2F4F4F’ 或 (0.18, 0.31, 0.31)
1、linestyle指定线型,可简写为“ls”。线型的选项为:
·
实线: ‘-’ (solid line)
·
虚线: ‘–’ (dashed line)
·
虚点线: ‘-.’ (dash-dot line)
·
点线: ‘:’ (dotted line)
·
无: '‘或’ ‘或’None’
1、linewidth指定线宽,可简写为“lw”。
2、marker描述数据点的形状
·
点线: ‘.’
·
点线: ‘o’
·
加号: '+
·
叉号: ‘x’
·
上三角: ‘^’
·
上三角: ‘v’
1、markerfacecolor指定数据点标记的表面颜色,可 简写为“ mfc”。
2、markersize指定数据点标记的大小,可 简写为“ ms”。
3.1.5 文本标注和图例
我们使用不同的线型和颜色,以10、e、2为基础绘制了一组幂函数曲线,并演示了文字标签和图例的使用。
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from pylab import mpl
>>> mpl.rcParams['font.sans-serif'] = ['FangSong']
>>> mpl.rcParams['axes.unicode_minus'] = False
>>> x = np.linspace(-4, 4, 200)
>>> f1 = np.power(10, x)
>>> f2 = np.power(np.e, x)
>>> f3 = np.power(2, x)
>>> plt.plot(x, f1, 'r', ls='-', linewidth=2, label='$10^x$')
>>> plt.plot(x, f2, 'b', ls='--', linewidth=2, label='$e^x$')
>>> plt.plot(x, f3, 'g', ls=':', linewidth=2, label='$2^x$')
>>> plt.axis([-4, 4, -0.5, 8])
>>> plt.text(1, 7.5, r'$10^x$', fontsize=16)
>>> plt.text(2.2, 7.5, r'$e^x$', fontsize=16)
>>> plt.text(3.2, 7.5, r'$2^x$', fontsize=16)
>>> plt.title('幂函数曲线', fontsize=16)
>>> plt.legend(loc='upper left')
>>> plt.show()
绘制图例时,loc 用于指定图例的位置。可用的选项有:
·
best
·
upper right
·
upper left
·
lower left
·
lower right
3.2 绘制多轴图
在介绍如何在同一个画板上绘制多个子图的同时,我将顺便演示如何绘制线条和矩形。我们可以使用 subplot 函数快速绘制多轴图表。 subplot函数的调用形式如下:
subplot(numRows, numCols, plotNum)
subplot 将整个绘图区域划分为 numRows 行 * numCols 列子区域,然后按照从左到右、从上到下的顺序对每个子区域进行编号,左上子区域的编号为 1。如果numRows、numCols 和 plotNum 三个数都小于 10,可以简写为整数,例如 subplot(323) 和 subplot(3,2,3) 是一样的。 subplot 在 plotNum 指定的区域中创建一个坐标区对象。如果新创建的轴与之前创建的轴重叠,则之前的轴将被删除。
>>> import matplotlib.pyplot as plt
>>> plt.subplot(221) # 两行两列的第1个位置
>>> plt.axis([-1, 2, -1, 2])
>>> plt.axhline(y=0.5, color='b')
>>> plt.axhline(y=0.5, xmin=0.25, xmax=0.75, color='r')
>>> plt.subplot(222) # 两行两列的第2个位置
>>> plt.axis([-1, 2, -1, 2])
>>> plt.axvline(x=0, ymin=0, linewidth=4, color='r')
>>> plt.axvline(x=1.0, ymin=-0.5, ymax=0.5, linewidth=4, color='g')
>>> plt.subplot(212) # 两行一列的第2个位置
>>> plt.axis([-1, 2, -1, 2])
>>> plt.axvspan(1.25, 1.55, facecolor='g', alpha=0.5)
>>> plt.axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5)
>>> plt.show()
3.3 常用绘图类型
3.3.1 直方图
使用numpy随机生成一个符合正态分布的数据集,统计分割区域的数据个数。
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> data = np.random.normal(5.0, 3.0, 1000)
>>> plt.hist(data)
>>> bins = np.arange(-5, 16, 1)
>>> plt.hist(data, bins) # 使用自定义的分段区域
>>> plt.show()
3.3.2 散点图
使用 plot() 绘图时,如果指定 style 参数仅绘制数据点(linestyle='None'),则绘制的是散列图。该方法绘制的点不能单独指定数据点的颜色和大小,但是使用 scatter() 绘制哈希图可以指定每个点的颜色和大小。
plt.scatter函数的调用形式如下:
scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None,
edgecolors=None,hold=None,data=None,**kwargs)
scatter() 的前两个参数是数组,分别指定每个点的 X 和 Y 坐标。 s参数指定点的大小,值与点的面积成正比。它可以是一个数字,指定所有点的大小,也可以是一个数组,分别指定每个点的大小。 c参数指定每个点的颜色,可以是数字也可以是数组。这里使用一维数组为每个点分配一个值。使用颜色图,每个值对应一种颜色。在默认颜色图中,蓝色对应于最小值,红色对应于值。当c参数为形状为(N,3)或(N,4)的二维数组时,直接表示每个点的RGB颜色。 marker 参数设置点的形状,可以是表示形状的字符串,也可以是表示多边形的两个元素的元组。第一个元素表示多边形的边数,第二个元素表示多边形的样式。 0, 1, 2, 3。0 表示多边形,1 表示星形,2 表示径向,3 表示忽略边数并显示为圆形。 alpha 参数设置点的透明度。当 facecolors 参数为“none”时,表示哈希点没有填充颜色。
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.random.rand(50)
>>> y = np.random.rand(50)
>>> area = np.pi * (15 * np.random.rand(50))**2
>>> color = 2 * np.pi * np.random.rand(50)
>>> plt.scatter(x, y, s=area, c=color, alpha=0.5, cmap=plt.cm.hsv)
>>> plt.show()
3.3.3 梯形图、柱状图、填充图
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> n = np.array([0,1,2,3,4,5])
>>> x = np.linspace(-0.75, 1., 100)
>>> plt.subplot(131)
>>> plt.step(n, n**2, lw=2)
>>> plt.subplot(132)
>>> plt.bar(n, n**2, align="center", width=0.5, alpha=0.5)
>>> plt.subplot(133)
>>> plt.fill_between(x, x**2, x**3, color="green", alpha=0.5)
>>> plt.show()
3.3.4 对数坐标
plot()绘制的图表的X-Y轴坐标都是算术坐标。绘制对数坐标图有三个函数:semilogx()、semilogy()、loglog(),分别在X轴为对数坐标、Y轴为对数坐标、两轴均为对数时绘制图形坐标。 .
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(0, 3, 100)
>>> y = np.power(2, np.power(2,x))
>>> plt.subplot(121)
>>> plt.semilogy(x, y , '-r')
>>> plt.subplot(122)
>>> plt.plot(x,y, '--g')
>>> plt.show()
3.3.5极坐标绘图
极坐标系是与笛卡尔(X-Y)坐标系完全不同的坐标系。极坐标系中的点用夹角和距中心点的距离表示。 polar(theta, r, **kwargs) 可以直接创建极坐标子图并在其中绘制曲线。你也可以使用程序调用 subplot() 来创建子图,通过将极坐标参数设置为 True 来创建极坐标子图,然后调用 plot() 在极坐标子图中绘制。
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> theta = np.arange(0, 2*np.pi, 0.02)
>>> plt.polar(theta, 1.4*np.cos(5*theta), "--", linewidth=2)
>>> plt.polar(theta, 1.8*np.cos(4*theta), linewidth=2)
>>> plt.rgrids(np.arange(0.5, 2, 0.5), angle=45)
>>> plt.thetagrids([0, 45])thetagridlabel objects>)
>>> plt.show()
>>>
3.4 2D绘图
3.4.1 等值线图
所谓等值线,是指函数值相等的点连接而成的平滑曲线。轮廓可以直观地表示二元函数值的变化趋势。例如,轮廓密集的地方,意味着这里的函数值变化更大。在 matplotlib 中,contour() 和 contourf() 可用于绘制等高线。它们之间的区别是:contourf() 获取具有填充效果的等高线。
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> y, x = np.ogrid[-2:2:200j, -3:3:300j]
>>> z = x * np.exp( - x**2 - y**2)
>>> extent = [np.min(x), np.max(x), np.min(y), np.max(y)]
>>> plt.subplot(121)
>>> cs = plt.contour(z, 10, extent=extent)
>>> plt.clabel(cs)
<a list of 8 text.Text objects>
>>> plt.subplot(122)
>>> plt.contourf(x.reshape(-1), y.reshape(-1), z, 20)
>>> plt.show()
为了更清楚的区分X轴和Y轴,这里他们取值的范围和等分的个数是不同的。这样得到的数组z的形状是(200, 300),它的第0轴对应Y轴,第1轴对应X轴。
调用 contour() 绘制数组 z 的等高线图。第二个参数为10,表示将整个函数的取值范围分为10个区间,即显示的等高线图中将有9条等高线。 .你可以使用范围参数来指定等值线图的 X 轴和 Y 轴的数据范围。
contour()返回的是一个QuadContourSet对象,传给clabel()为里面的轮廓标注对应的值。
调用contourf()绘制等高线图,将取值范围分成20等份,具有填充效果。这是另一种设置 X 轴和 Y 轴取值范围的方法。它的前两个参数是用于计算数组 z 的 X 轴和 Y 轴上的采样点。这两个数组必须是一维的。的。
3.4.2 二维数据的平面色彩显示
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> data=np.clip(np.random.randn(5,5),-1,1)
>>> plt.subplot(221)
>>> plt.imshow(data)
>>> plt.subplot(222)
>>> plt.imshow(data,cmap=plt.cm.cool)
>>> plt.subplot(223)
>>> plt.imshow(data,cmap=plt.cm.hot)
>>> plt.colorbar()
>>> plt.subplot(224)
>>> im = plt.imshow(data,cmap=plt.cm.winter)
>>> plt.colorbar(im, cmap=plt.cm.winter, ticks=[-1,0,1])
>>> plt.show()
3.5 3D绘图
虽然 matplotlib 主要专注于绘图,主要是二维图形,但它也有一些不同的扩展,允许我们在地理地图上绘图,允许我们结合 Excel 和 3D 图表。在 matplotlib 世界中,这些扩展被称为工具包。工具包是专注于某个主题(例如 3D 图形)的特定功能的集合。
比较流行的工具包有Basemap、GTK 工具、Excel工具、Natgrid、AxesGrid和mplot3d。
mpl_toolkits.mplot3 工具包提供了一些基本的 3D 绘图功能。支持的图表类型包括散点图、曲面图、冲浪图、折线图和网格图。 mplot3d虽然不是最好的3D图形绘制库,但它自带matplotlib,所以我们已经熟悉了它的界面。
下面是一个使用plot_surface绘制3d曲面图的例子。
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import mpl_toolkits.mplot3d
>>> x, y = np.mgrid[-2:2:50j,-2:2:50j]
>>> z = x*np.exp(-x**2-y**2)
>>> ax = plt.subplot(111,projection='3d')
>>> ax.plot_surface(x,y,z,rstride=2,cstride=1,cmap=plt.cm.coolwarm,alpha=0.8)
>>> ax.set_xlabel('x')
>>> ax.set_ylabel('y')
>>> ax.set_zlabel('z')
>>> plt.show()
python学习网,免费的在线学习
,欢迎关注!
1、
2、
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python中文件的文件格式是什么10/30
- ♥ Python如何在一个canvas中绘制多个图表?11/29
- ♥ python如何判断一个对象的类型09/04
- ♥ 如何在python中将Array和DataFrame相互转换08/29
- ♥ 如何配对python和spyder09/23
- ♥ 如何在python中查找变量名10/13
内容反馈