美文网首页
Python-Matplotlib库

Python-Matplotlib库

作者: JUNjianshuZHU | 来源:发表于2018-04-26 13:54 被阅读0次

本文转载来源:Python绘图库Matplotlib入门教程
本文同时使用了这里的教学代码:Matplotlib 画图教程系列 _ 莫烦Python


0、入门代码示例

下面我们先看一个最简单的代码示例,让我们感受一下Matplotlib是什么样的:

import matplotlib.pyplot as plt
import numpy as np

#需要展现的数据
data = np.arange(100, 201)

#设定x,y轴的最大、最小值
plt.axis([0,100,50,300])

#另一种设定x,y轴的最大、最小值的方式
#plt.xlim(0,100)
#plt.ylim(50,300)

#设定x轴标记,可以用字符代替
plt.xticks(np.linspace(0,100,5,endpoint=True),['$one$','$two$','one','two','five'])

#设定y轴标记
plt.yticks(np.linspace(50,300,5,endpoint=True))

 #设定图表标题
plt.title('Easy as 1, 2, 3')

#设定x,y轴标签的字体,颜色
plt.xlabel('x numbers',fontsize=14, color='red')      
plt.ylabel('y numbers',fontsize=14, color='red')

#在图表内增加公式
plt.text(20, 250, r'$\mu=100,\ \sigma=15,\bigcap $')

#设置背景网格线
plt.grid(True)

#设置打印线段的颜色、线宽、线型
plt.plot(data,color="blue", linewidth=1.0, linestyle="-")

plt.show()

#保存图片
plt.savefig('my_first_chart.png')

这段代码=绘制出了一个非常直观的线性图,如下所示:


对照着这个线形图,我们来讲解一下三行代码的逻辑:

  1. 通过np.arange(100, 201)生成一个[100, 200]之间的整数数组,它的值是:[100, 101, 102, … , 200]
  2. 通过matplotlib.pyplot将其绘制出来。很显然,绘制出来的值对应了图中的纵坐标(y轴)。而matplotlib本身为我们设置了图形的横坐标(x轴):[0, 100],因为我们刚好有100个数值
  3. 通过plt.show()将这个图形显示出来

查看更多公式的写法


1、一次绘制多个图形

有些时候,我们可能希望一次绘制多个图形,例如:两组数据的对比,或者一组数据的不同展示方式等。

可以通过下面的方法创建多个图形:

多个figure

可以简单的理解为一个figure就是一个图形窗口。matplotlib.pyplot会有一个默认的figure,我们也可以通过plt.figure()创建更多个。如下面的代码所示:

import matplotlib.pyplot as plt
import numpy as np

#创建第1个图形窗口
plt.figure()

#创建第2个窗口并设定窗口名称为3、尺寸(8*6)、分辨率80
plt.figure(num = 3,figsize=(8,6), dpi=80)

data = np.arange(100, 201)
plt.plot(data)

plt.figure(figsize=(8,6), dpi=80)

data2 = np.arange(200, 301)
plt.plot(data2)

plt.show()

这段代码绘制了两个窗口的图形,它们各自是一个不同区间的线形图,如下所示:



多个subplot

有些情况下,我们是希望在同一个窗口显示多个图形。此时就这可以用多个subplot。下面是一段代码示例:

import matplotlib.pyplot as plt
import numpy as np

data = np.arange(100, 201)
#选择2行1列subplot中的第1个subplot
plt.subplot(2, 1, 1)  #等于plt.subplot(211)
plt.plot(data)

data2 = np.arange(200, 301)
#选择2行1列subplot中的第2个subplot
plt.subplot(2, 1, 2)  #等于plt.subplot(212)
plt.plot(data2)

plt.show()

这段代码中,除了subplot函数之外都是我们熟悉的内容。subplot函数的前两个参数指定了subplot数量,即:它们是以矩阵的形式来分割当前图形,两个整数分别指定了矩阵的行数和列数。而第三个参数是指矩阵中的索引。

所以这段代码的结果是这个样子:


不均匀图中图:


不均匀图中图

代码:

#相当于将画布分为2行3列
#第一行图占了3个位置
plt.subplot(2,1,1)
plt.plot([0,1],[0,1])

#第二行第1个图从4开始
plt.subplot(2,3,4)
plt.plot([0,1],[0,2])

plt.subplot(235)
plt.plot([0,1],[0,3])

plt.subplot(236)
plt.plot([0,1],[0,4])

plt.show()  # 展示

更复杂的不均匀图中图:



代码:

#画第一部分
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
#使用plt.subplot2grid来创建第1个小图, (3,3)表示将整个图像窗口分成3行3列, (0,0)表示从第0行第0列开始作图,colspan=3表示列的跨度为3, rowspan=1表示行的跨度为1. colspan和rowspan缺省, 默认跨度为1

ax1.plot([1, 2], [1, 2])    # 画小图
ax1.set_title('ax1_title')  # 设置小图的标题

#继续画其他部分
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax5 = plt.subplot2grid((3, 3), (2, 1))

#可以对每个部分单独设置图表和其他属性
ax4.scatter([1, 2], [2, 2])
ax4.set_xlabel('ax4_x')  #!设置坐标轴标签要用set_xlabel
ax4.set_ylabel('ax4_y')

subplot函数的详细说明参见这里:matplotlib.pyplot.subplot
Subplot分格显示


2、常用图形示例

Matplotlib可以生成非常多的图形式样,多到令人惊叹的地步。大家可以在这里:Matplotlib Gallery 感受一下。

本文作为第一次的入门教程,我们先来看看最常用的一些图形的绘制。

线性图

前面的例子中,线性图的横轴的点都是自动生成的,而我们很可能希望主动设置它。另外,线条我们可能也希望对其进行定制。看一下下面这个例子:

import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [3, 6, 9], '-r',label="xxx")
plt.plot([1, 2, 3], [2, 4, 9], ':g',label="yyy")

#图例位置
plt.legend(loc='upper left')  #loc指定图裂位置,loc='best'让系统自动判断最佳位置

plt.show()

这段代码可以让我们得到这样的图形:


这段代码说明如下:

  1. plot函数的第一个数组是横轴的值,第二个数组是纵轴的值,所以它们一个是直线,一个是折线;
  2. 最后一个参数是由两个字符构成的,分别是线条的样式和颜色。前者是红色的直线,后者是绿色的点线。关于样式和颜色的说明请参见plot函数的API Doc:matplotlib.pyplot.plot
  3. plt.legend 的 loc可选参数

散点图

scatter函数用来绘制散点图。同样,这个函数也需要两组配对的数据指定x和y轴的坐标。下面是一段代码示例:

import matplotlib.pyplot as plt
import numpy as np

N = 20

plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c='r', s=100, alpha=0.5)

plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c='g', s=200, alpha=0.5)

plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c='b', s=300, alpha=0.5)

plt.show()

这段代码说明如下:

这幅图包含了三组数据,每组数据都包含了20个随机坐标的位置
参数c表示点的颜色,s是点的大小,alpha是透明度
这段代码绘制的图形如下所示:


scatter函数的详细说明参见这里:matplotlib.pyplot.scatter


饼状图

pie函数用来绘制饼状图。饼状图通常用来表达集合中各个部分的百分比。

import matplotlib.pyplot as plt
import numpy as np

labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

data = np.random.rand(7) * 100

plt.pie(data, labels=labels, autopct='%1.1f%%')
plt.axis('equal')
plt.legend()

plt.show()

这段代码说明如下:

  1. data是一组包含7个数据的随机数值
  2. 图中的标签通过labels来指定
  3. autopct指定了数值的精度格式
  4. plt.axis('equal')设置了坐标轴大小一致
  5. plt.legend()指明要绘制图例(见下图的右上角)
    这段代码输出的图形如下所示:


pie函数的详细说明参见这里:matplotlib.pyplot.pie


条形图

bar函数用来绘制条形图。条形图常常用来描述一组数据的对比情况,例如:一周七天,每天的城市车流量。

下面是一个代码示例:

import matplotlib.pyplot as plt
import numpy as np

N = 7

#设定x,y的数值
x = np.arange(N)
data = np.random.randint(low=0, high=100, size=N)

#设定每条数值的颜色
colors = np.random.rand(N * 3).reshape(N, -1)

#设定x轴数值标签
labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

#设定y轴范围
plt.ylim(0,130)

#设定图表标题
plt.title("Weekday Data")

#创建条形图
plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels)

#设定数值标签
for i,j in zip(x,data):
    plt.text(i,j+1,
             '%.2f' %j,
             ha='center',  #ha: horizontal alignment
             va='bottom'  #va: vertical alignment
             )

plt.show()

这段代码说明如下:

  1. 这幅图展示了一组包含7个随机数值的结果,每个数值是[0, 100]的随机数
  2. 它们的颜色也是通过随机数生成的。np.random.rand(N * 3).reshape(N, -1)表示先生成21(N x 3)个随机数,然后将它们组装成7行,那么每行就是三个数,这对应了颜色的三个组成部分。如果不理解这行代码,请先学习一下Python 机器学习库 NumPy 教程
  3. title指定了图形的标题,labels指定了标签,alpha是透明度

这段代码输出的图形如下所示:


bar函数的详细说明参见这里:matplotlib.pyplot.bar


直方图

hist函数用来绘制直方图。直方图看起来是条形图有些类似。但它们的含义是不一样的,直方图描述了数据中某个范围内数据出现的频度。这么说有些抽象,我们通过一个代码示例来描述就好理解了:

import matplotlib.pyplot as plt
import numpy as np

data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
labels = ['3K', '4K', '5K']
bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000]

plt.hist(data, bins=bins, label=labels)
plt.legend()

plt.show()

上面这段代码中,[np.random.randint(0, n, n) for n in [3000, 4000, 5000]]生成了包含了三个数组的数组,这其中:

  • 第一个数组包含了3000个随机数,这些随机数的范围是 [0, 3000)
  • 第二个数组包含了4000个随机数,这些随机数的范围是 [0, 4000)
  • 第三个数组包含了5000个随机数,这些随机数的范围是 [0, 5000)
    bins数组用来指定我们显示的直方图的边界,即:[0, 100) 会有一个数据点,[100, 500)会有一个数据点,以此类推。所以最终结果一共会显示7个数据点。同样的,我们指定了标签和图例。

这段代码的输出如下图所示:


在这幅图中,我们看到,三组数据在3000以下都有数据,并且频度是差不多的。但蓝色条只有3000以下的数据,橙色条只有4000以下的数据。这与我们的随机数组数据刚好吻合。

hist函数的详细说明参见这里:matplotlib.pyplot.hist


次坐标轴图

定义:即在同个图上有第 2个 y轴存在

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 10, 0.1)
y1 = 0.05 * x**2
y2 = -1 *y1

#获取figure默认的坐标系 ax1
fig, ax1 = plt.subplots()

#对ax1调用twinx()方法,生成如同镜面效果后的ax2
ax2 = ax1.twinx()    # mirror the ax1
ax1.plot(x, y1, 'g-')
ax2.plot(x, y2, 'b-')

ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data', color='g')
ax2.set_ylabel('Y2 data', color='b')

plt.show()

3、附加

解决matplotlib显示中文的方法

from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

4、参考资料与推荐读物

01、 Matplotlib官方网站

02、 Matplotlib 教程(译文)

03、 Matplotlib 教程(原文)

相关文章

网友评论

      本文标题:Python-Matplotlib库

      本文链接:https://www.haomeiwen.com/subject/wkgplftx.html