用Matplotlib包绘图

Matplotlib包的绘图功能很强大,本节主要介绍二维点图、线形图、条形图、面积图和饼图的绘制。[大谦Excel,dqexcel点com]

点图

点图用孤立的点来表示指定位置上数据的大小,全部点绘制以后可以很清晰地表现数据的分布特征。使用plot函数绘制点图。

一、简单点图

如果只有一组数据,可以绘制简单点图。如果对横坐标没有特殊要求,可以直接输入纵坐标数据列表作为plot函数的参数绘图。下面首先导入Matplotlib包,然后调用plot函数绘图,调用show函数显示图形。plot函数的第2个参数’ro’中,r表示红色,o表示实心圆标记。用show方法显示绘图窗口。

code.python
>>> import matplotlib.pyplot as plt
>>> plt.plot([1, 3, 8, 6, 10, 15], "ro")
>>> plt.show()

生成图10-1。

Document Image

图10-1 简单点图

标记类型的设置可参照表10-1,共计20余种。

表10-1 标记类型

标 记 说 明 标 记 说 明 标 记 说 明
'.' 'h' 六边形点1 '1' 下三叉点
'o' 圆点 '+' 加号点 '3' 左三叉点
'^' 上三角点 'D' 实心菱形点 's' 正方点
'>' 右三角点 '_' 横线点 '*' 星形点
'2' 上三叉点 ',' 像素点 'H' 六边形点2
'4' 右三叉点 'v' 下三角点 'x' 乘号点
'p' 五角点 '<' 左三角点 'd' 瘦菱形点

上面绘图没有指定横坐标。也可以指定横坐标,如下例所示。要求横坐标向量和纵坐标向量的大小要相同。

code.python
>>> plt.plot([3, 4, 5, 6, 7, 8], [1, 3, 8, 6, 10, 15], "ro")
>>> plt.show()

生成图10-2。请注意横坐标的变化。

Document Image Document Image

图10-2 设置横坐标 图10-3 复合点图

二、复合点图

复合点图是利用多组数据绘制点图,用不同的颜色和标记区分不同的分组。下面用NumPy包的arrange函数在1到4范围内以0.2为步长等间隔取值作为横坐标,用横坐标数据和它们的正弦值和余弦值分别作为纵坐标绘制复合点图。

code.python
>>> import numpy as np   #导入NumPy包
>>> import matplotlib.pyplot as plt
>>> t = np.arange(1., 4., 0.2)   #横坐标
>>> #3个简单点图复合:t-t, 红色,*标记;
>>> # t-sin(t), 绿色,正方点标记;t-cos(t), 兰色,上三角点标记
>>> plt.plot(t, t, "r*", t, np.sin(t), "gs", t, np.cos(t), "b^")
>>> plt.show()

生成图10-3。

线形图

线形图在点图的基础上用直线段将相邻的点相连,用线形来表现数据的分布特征。对应于单组数据和多组数据,有简单线形图和复合线形图。

一、简单线形图

简单线形图是对一组数据绘制线形图,线形图的控制点由数据的横坐标和纵坐标确定。下面指定横坐标数据在-4到4范围内以1为步长等间隔取值,纵坐标数据取横坐标数据的正弦值,然后用plot方法绘图。

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> t = np.arange(-4., 4., 1)    #横坐标数据
>>> plt.plot(t, np.sin(t))    #计算纵坐标数据,绘图
>>> plt.show()

生成图10-4。默认时线条的颜色为兰色。

Document Image

图10-4 简单线形图

用Matplotlib包绘图时,可用3种方式着色,即标准颜色着色、16进制着色和RGB着色。表10-2中为常见的8种颜色的字符表示和16进制表示。

表10-2 标准颜色

字 符 颜 色 16进制表示 字 符 颜 色 16进制表示
'b' 兰色 '#0000FF' 'm' 品红色 '#FF00FF'
'g' 绿色 '#008000' 'y' 黄色 '#FFFF00'
'r' 红色 '#FF0000' 'k' 黑色 '#000000'
'c' 青色 '#00FFFF' 'w' 白色 '#FFFFFF'

下面的前3条语句都绘制相同数据确定的青色简单线形图,数据点用红色实心圆标记表示。颜色相关的参数名称往往包含"color"字样。

code.python
>>> import matplotlib.pyplot as plt
>>> plt.plot([1, 3, 8, 6, 10, 15], color="c", marker="o", markerfacecolor="r")
>>> plt.plot([1, 3, 8, 6, 10, 15], color="c", marker="o", markerfacecolor="#FF0000")
>>> plt.plot([1, 3, 8, 6, 10, 15], color="c", marker="o", markerfacecolor=(1.0,0.0,0.0))
>>> plt.show()

前3个语句都生成图10-5所示的效果。

Document Image Document Image

图10-5 设置线形图的颜色 图10-6 设置线型和线宽

线条的线型可以用plot方法的linestyle参数设置,可以设置为实线、虚线、点虚线和点线等,对应的符号如下所示:

• '-' - 实线

• '-.' - 点虚线

• '--' - 虚线

• ':' - 点线

线条的线宽可以用plot方法的linewidth参数设置,设置为大于0的整数。

下面根据给定的横坐标数据和计算得到的正弦值和余弦值纵坐标数据绘制两个线形图。正弦数据的图形线型为点线,线宽为3;余弦数据的图形线型为点虚线,线宽为5。

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> t = np.arange(-4., 4., 1)    #横坐标数据
>>> plt.plot(t, np.sin(t), linestyle=":", linewidth=3)  #正弦数据图形
>>> plt.plot(t, np.cos(t), linestyle="-.", linewidth=5)  #余弦数据图形
>>> plt.show()

生成图10-6。

二、复合线形图

复合线形图用多组数据绘制线形图。复合线形图可以用类似生成图10-6的代码用每条折线的数据分别绘图,也可以在plot方法中对每条折线设置数据和属性一次性绘制完毕。

下面用NumPy包的arrange函数在1到4范围内以0.1为步长等间隔取值作为横坐标,用横坐标数据和它们的正弦值和余弦值分别作为纵坐标绘制复合线形图。3条折线分别用红色实线、绿色虚线和兰色点线绘制。

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> t = np.arange(1., 4., 0.1)
>>> plt.plot(t, t, "r-", t, np.sin(t), "g--", t, np.cos(t), "b:")
>>> plt.show()

生成图10-7。

Document Image

图10-7 复合线形图

10.2.3条形图

条形图用填充矩形表示数据的大小和分布特征。根据绘图数据的组数,绘制简单条形图和复合条形图。

一、简单条形图

只有1组数据时,绘制简单条形图。下面取1到6范围内的整数作为横坐标,纵坐标用列表指定6个整数,用bar方法绘制条形图。用color参数指定条形的颜色为红色。

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.arange(1, 7, 1)  #横坐标
>>> y=[1, 3, 8, 6, 10, 15]  #纵坐标
>>> plt.bar(x,y, color="r")  #绘红色条形图
>>> plt.show()

生成图10-8。

Document Image Document Image

图10-8 简单条形图 图10-9 横向简单条形图

使用barh方法绘制横向条形图。下面用x和y数据绘图。

code.python
>>> plt.barh(x,y, color="r")
>>> plt.show()

生成图10-9。

给color参数指定为列表,可以用不同的颜色给图中的条形着色。下面给每个条形区域单独指定颜色。

code.python
>>> plt.barh(x,y, color=["r", "y", "b", "g", "c", "m"])
>>> plt.show()

生成图10-10。

Document Image Document Image

图10-10 给每个条形着色 图10-11 复合条形图

二、复合条形图

复合条形图表现多组数据的大小和分布特征,每个点上各组数据用不同颜色的条形并排放置组成一个复合条形。Matplotlib包没有提供专门绘制复合条形图的方法,但是使用bar方法,通过控制单个条形的宽度和每个条形的位置可以比较方便地实现复合条形图的绘制。

下面给定横坐标数据,用其正弦数据+1和余弦数据+1作为纵坐标分别绘条形图。条形宽度为0.3,后一组条形图的条形位置为前一组的位置+0.3。显示图例和网格。

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> plt.figure()  #新建绘图窗口
>>> t=np.arange(-4., 4., 1)    #横坐标数据
>>> plt.bar(t, 1+np.sin(t), label="sin", width=0.3, color="r") #正弦数据条形图
>>> plt.bar(t+0.3, 1+np.cos(t), label="cos", width=0.3, color="g") #余弦数据条形图
>>> plt.legend()  #绘制图例
>>> plt.grid(linestyle="-.", alpha=0.5)  #绘制网格,点虚线,半透明
>>> plt.show()  #显示绘图窗口

生成图10-11。

面积图

面积图实际上是将线形图与0基线首尾各自相连形成一个区域,用颜色填充该区域来表现数据的大小和分布特征。根据绘图数据的组数,绘制简单面积图和堆栈面积图。

一、简单面积图

使用stackplot方法绘制面积图,只有一组数据时,绘制简单面积图。下面给定一组数据,绘制简单面积图。

code.python
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = [1, 2, 3, 4, 5]
>>> y = [1, 1, 2, 3, 5]
>>> plt.stackplot(x, y)
>>> plt.show()

生成图10-12。

Document Image Document Image

图10-12 简单面积图 图10-13 堆栈面积图

二、堆栈面积图

指定多组数据时,用stackplot方法绘制的是堆栈面积图,外观如图10-14所示。可以这样理解堆栈面积图:首先绘制最上面一组数据对应的简单面积图,然后依次绘制下面各组数据对应的简单面积图,后绘制的覆盖先绘制的图形的部分面积,最后形成堆栈的效果。

下面用列表指定1组横坐标,用列表指定3组纵坐标,用stackplot方法绘制堆栈面积图。

code.python
>>> import matplotlib.pyplot as plt
>>> #指定数据
>>> x = [1, 2, 3, 4, 5]
>>> y1 = [2, 1, 4, 3, 5]
>>> y2 = [0, 2, 1, 6, 4]
>>> y3 = [1, 4, 5, 8, 6]
>>> #绘图
>>> plt.stackplot(x, y1, y2, y3)
>>> plt.show()

生成图10-13所示的堆栈面积图。

饼图

饼图用圆形区域中不同大小和颜色的扇区来表现给定数据在整体中所占的份额。绘制时需要指定每组数据的标签和各自对应的百分比。

使用pie方法绘制饼图。该方法的主要参数包括:

• data – 指定各部分所占百分比的数据。

• labels – 指定各部分的标签。

• radius – 指定饼图的半径。

• explode – 指定饼图要分离的部分。

• autopct – 指定显示百分比数据的字符串格式。默认值为None,不显示百分比。

• colors – 指定各部分的颜色。默认时值为None,自动设置颜色。

• startangle – 指定饼图第1个部分的起始角。

• counterclock – 指定饼图的绘制方向。默认值为True,按逆时针方向绘制。

• shadow – 指定是否绘制饼图的阴影。默认值为False,不绘制阴影。

下面指定数据标签和占总体的百分比数据,用pie方法绘制饼图。绘制阴影,起始角度为90度,百分比输出保留1位小数。

code.python
>>> import matplotlib.pyplot as plt
>>> labels=["Class 1", "Class 2", "Class 3", "Class 4", "Class 5"]
>>> sizes = [15, 30, 25, 10, 20]
>>> plt.pie(sizes, labels=labels, shadow=True, autopct="%1.1f%%", startangle=90)
>>> plt.axis("equal")   #横纵轴比例相同
>>> plt.show()

生成图10-14。

Document Image Document Image

图10-14 饼图 图10-15 分离的效果

设置explode参数,可以将部分扇区分离显示,以突出和强调该部分。该参数的值用一个元组指定,不分离的部分用0表示,要分离的部分用0和1之间的小数表示,指定分离的程度。

code.python
>>> import matplotlib.pyplot as plt
>>> labels=["Class 1", "Class 2", "Class 3", "Class 4", "Class 5"]
>>> sizes=[15, 30, 25, 10, 20]
>>> explode=(0, 0.1, 0, 0, 0)    #指定分离的部分
>>> plt.pie(sizes, explode=explode, labels=labels, shadow=True, \
autopct="%1.1f%%", startangle=90)
>>> plt.axis("equal")
>>> plt.show()

生成图10-15。