matplotlib 是一个用于在 python 中绘制数组的 2D 图形库。虽然它起源于模仿 MATLAB 图形命令,但它独立于 MATLAB,虽然 matplotlib 主要是在纯 python 中编写的,但它大量使用 numpy 和其他扩展代码,即使对于大型数组也能提供良好的性能。
matplotlib 的设计理念是,码农们只需要一个或几个命令就可以创建简单的图形,比如你想根据你的数据绘制出一个直方图,你不需要实例化对象,调用方法,设置属性等等,直接几行代码就会出来漂亮的效果。
当然,matplotlib 的画图功能是丰富的,我们不但能够用它轻松的画出折线图,直方图,功率谱图,散点图等常用图表,而且绘制其它复杂的图形也是轻车熟路。
我们在学习一个新的数据类型时,首先就是如何初始化它,类似于前面学习的 numpy 和 pandas,同样我们要想使用 matplotlib,首先就要先初始化它,我们知道 matplotlib 是根据数据画图的,我们可以用 list、tuple、dict、numpy、pandas 等等来初始化 matplotlib 的数据,然后直接调用不同的画图的函数就可以画出我们不同的图形。
我们首先用两个 list 数组初始化了 matplotlib(plt 是我们导入模块时给 matplotlib 起的别名,因为 matplotlib 单词太长了,为了少打几个单词,我们以后都是用 plt),我们调用 plt 的 plot 函数说明我们想要使用数据画一个折线图。然后直接调用 plt 的 show 函数,就画出了我们想要的折线图。代码和效果如下图所示。
import matplotlib.pyplot as plt plt.plot([1, 2, 3], [5, 7, 4]) plt.show()
运行结果如下图:
用其它数据类型的数据初始化 plt 的方法,大家可以自行写代码试验,为了更方便的学习 plt,我们主要讲解 plt 画图函数的使用以及画图参数的使用。
我们想给我们显示的折线图来一个说明,只需要传入一个 label 参数即可,然后在绘制之前调用 plt 的 legend 函数。
import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题 plt.plot([-1, -2, 3], [5, -7, -4], label='测试') plt.legend() plt.show()
运行结果如下图:
注意,如果 label 给定的参数是中文,则需要提前指定字体, pylab 的 mpl 对象可以指定字体,首先我们要先导入 pylab 模块(from pylab import mpl)不然的话中文则不会显示。在上面代码中,我们指定字体为微软雅黑,大家也可以试着指定你系统支持的其它字体。
我们也可以通过 plt 提供的 xlabel 和 ylabel 来设置横轴和纵轴的说明,代码和效果如下图。
import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.plot([20, 40, 60], [50, 90, 150], label='房价图') plt.xlabel('房屋面积') plt.ylabel('房价') plt.legend() plt.show()
运行结果如下图:
我们也可以在一张坐标图中画多条折线,我们只需要给函数传入多组数据即可,代码和效果如下图,我们发现第二条折线的颜色会被改变,当然我们可以传入参数自己设置我们想要的颜色。另外,我们可以通过title函数可以设置整个坐标图的标题。
import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.plot([20, 40, 60], [50, 90, 150], label='房价图') plt.plot([20, 30, 50], [30, 68, 130], label='房价优惠图') plt.xlabel(u'房屋面积') plt.ylabel(u'房价') plt.title(u'两条房价图') plt.legend() plt.show()
运行结果如下图:
我们也可以通过 plt 的 bar 函数来画出条形图,这儿我们通过 color 参数来设置两个条形图的颜色。
import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.bar([1, 5, 3, 7], [7, 3, 12, 0], label=u"条形图1", color='r') plt.bar([2, 6, 3, 7], [9, 6, 5, 7], label=u"条形图2", color='g') plt.xlabel(u'x轴') plt.ylabel(u'y轴') plt.title(u'两个条形图') plt.legend() plt.show()
运行结果如下图:
我们也可以通过 plt 的 scatter 函数来画出散点图,每个散点图需要两组数组进行初始化,另外,我们可以通过 s 参数我们可以设置点的大小。
import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] x1 = [6, 2, 3, 2, 5, 1, 7, 9] y1 = [1, 2, 7, 6, 1, 4, 2, 5] x2 = [1, 2, 3, 5, 7, 11, 21, 13] y2 = [4, 5, 6, 2, 33, 2, 4, 15] plt.scatter(x1, y1, label='散点图', color='g', s=70) # s是点的大小 plt.scatter(x2, y2, label='散点图', color='r', s=20) # s是点的大小 plt.xlabel('x轴') plt.ylabel('y轴') plt.title('两组散点图') plt.legend() plt.show()
运行结果如下图:
我们也可以通过 plt 的 stackplot 函数来画出堆叠图, 堆叠图可以传入 N 个数组在一个坐标系里面显示,每个数组初始化一个独立的堆叠图。
import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] days = [1, 2, 3, 4, 5] sleeping = [7, 8, 6, 11, 7] eating = [2, 3, 4, 3, 2] working = [7, 8, 7, 2, 2] playing = [8, 5, 7, 8, 13] colors = ['m', 'b', 'r', 'g'] plt.stackplot(days, sleeping, eating, working, playing, colors=colors) plt.xlabel('x轴') plt.ylabel('y轴') plt.title('每周作息图') plt.legend() plt.show()
运行结果如下图:
我们也可以通过 plt 的 pie 函数来画出饼状图,饼状图里面可以传入很多参数,在下面的代码中案例中,我使用了常用的参数,大家如有另外的需求可以自行查阅。
import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] boys = 47 girls = 23 others = 7 slices = [boys, girls, others] labels = ['男生', '女生', '未知'] cols = ['c', 'm', 'g'] plt.pie(slices, labels=labels, colors=cols, startangle=90, # 饼状图旋转90度 shadow=True, # 显示阴影 explode=(0.0, 0.1, 0), # 离心距离 autopct='%1.2f%%') # 百分比显示小数点位数 plt.title('我的微信好友的男女比例') plt.legend() plt.show()
运行结果如下图:
如果我们的数据来源是 pandas 类型的文件或者 numpy 类型的文件,我们可以使用 pandas 提供的读文件函数或者 numpy 的读文件函数先把数据读入到内存中,然后就可以画图了。
import numpy as np import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] npdata = np.loadtxt('npdata.txt', dtype=int) # 读出整型数据,默认为float plt.plot(npdata[0], npdata[1], label='折线图') plt.xlabel('x轴') plt.ylabel('y轴') plt.title('测试数据') plt.legend() plt.show()
如上代码案例,我们使用 numpy 的 loadtxt 函数读取文件(dtype 设置 numpy 的数据类型,否则默认为 float 类型),文件内容如下图:
然后使用 numpy 数据初始化 plt,然后使用 plot 函数画出折线图,运行结果如下图:
掌握matplotlib的初始化方法
熟练掌握常用的画图函数
熟练使用画图函数的参数来丰富图形